代码之家  ›  专栏  ›  技术社区  ›  Flash_Steel

Std::带unique_ptr的数组

  •  1
  • Flash_Steel  · 技术社区  · 8 年前

    我有一个类,我想通过传递一个值数组来实例化它。此处的对象有两个成员,但为了便于说明,已将其简化。将来,我将从磁盘读取值,然后根据这些值创建一个对象,即数组。该对象稍后将有多个指针,因此为shared_ptr。

    首先,我想知道这是否可以防止内存泄漏。其次,我想了解是否有一些不那么臃肿的方法来实例化对象,然后在稍后确定地销毁它们。

    类头文件:

    //MyClass.hpp
    #pragma once
    #include "stdafx.h"
    #include <array>
    
    class SimpleClass{
        private:
            //Per object
            double var1;
            double var2;
        public static:
            //For calling when using templates such as std::array<>
            //Using __int8 as will not be > 256
            static const uint8_t varCount 2;
            SimpleBody(std::array<double, varCount> inputArray);
            ~SimpleBody();
    }
    

    课堂实施

    //MyClass.cpp
    #pragma once
    #include "stdafx.h"
    #include <array>
    #include "body.hpp"
    
    SimpleBody::SimpleBody(std::array<double, SimpleBody::varCount> inputArray ) {
        //Assign var1
        MyClass::var1= inputArray[0];
        //Assign var2
        MyClass::var2= inputArray[1];
    };
    
    SimpleBody::~SimpleBody() {
        //Add in code here when children need deleting
    }; 
    

    入口点

    // EntryPoint.cpp
    //
    
    #include "stdafx.h"
    #include "MyClass.hpp"
    #include <array>
    #include <memory>
    
    int main()
    {
        //Create an array with a smart pointer for memory management
        std::unique_ptr< std::array<double, MyClass::varCount> > initArray =
            std::make_unique< std::array<double, MyClass::varCount> >();
        //Define values
        *initArray = { 1.0,2.0 };
        //Use array to create object
        std::shared_ptr<MyClass> object = std::make_shared<MyClass>(*initArray );
    
        //Free memory
        initArray.reset();
        object.reset();
    
        return 0;
    }
    
    2 回复  |  直到 8 年前
        1
  •  2
  •   Hayt    8 年前

    int main()
    {
        std::array<double, MyClass::varCount> initArray = { 1.0,2.0 };
        std::shared_ptr<MyClass> object = std::make_shared<MyClass>(initArray );
        return 0;
    }
    

    这也会起到同样的作用。

    对于“不那么臃肿”:

    总是有 auto :

    int main()
    {
        auto initArray = std::make_unique< std::array<double,  MyClass::varCount> >();
        *initArray = {1.0,2.0};
        auto object = std::make_shared<MyClass>(*initArray );
        return 0;
    }
    
        2
  •  2
  •   ladaManiak    8 年前

    首先,如果在SimpleBody构造函数中按值传递数组,那就不好了。更好地使用参考

     SimpleBody(const std::array<int, varCount> &inputArray);
    

    此时,您构造shared_ptr,unique_ptr将失去数组的所有权。您不需要手动重置。此外,此时,您的程序点击}行,内存将被释放。