2016-09-19 4 views
0

У меня есть класс, который я хочу создать, передавая массив значений. Объект здесь имеет два члена, но это было уменьшено для иллюстрации. В будущем я буду читать значения с диска, а затем создать объект из этих значений, следовательно, массив. Объект будет иметь несколько указателей позже, следовательно, shared_ptr.Std :: Array with unique_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; 
} 
+4

Я не могу сделать какой-то смысл вашего вопроса, но я думаю, что вам нужно потратить некоторое время на изучение основ C++ , – juanchopanza

+0

вам не нужно вручную освобождать память уникального и общего ptr. Они сделают это сами. И вы всегда разбираете свой уникальный массив ptr. Вы можете просто сохранить его в стеке, а не создавать его в куче. – Hayt

+0

Мой друг, который некоторое время работал разработчиком, сказал мне, что лучше явно освободить память, когда вы знаете, что вам это не нужно, а затем, когда вы забудете, функция smart_ptr может действовать как защитная сетка. Неужели он просто педантичен или есть времена, когда полагаться на smart_ptr на свободную память может вызвать утечку memroy? –

ответ

2

В вашем примере вы можете пропустить уникальный указатель, потому что вы хотите, только значения в любом случае

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; 
} 
+0

Менее раздутым может быть 'MyClass ({{1., 2.}});'. Трудно сказать, потому что большая часть кода OP, похоже, не имеет никакой причины. – juanchopanza

+0

Я предположил, что shared_ptr необходим, и что вы помещаете массив там. Но год для кода OP это будет наименьший код. – Hayt

2

Прежде всего его плохо, если вы передаете массив по значению в конструкторе SimpleBody. Лучше использовать ссылку

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

На данный момент, вы строите свой shared_ptr unique_ptr теряет право собственности на массив. Вам не нужно выполнять сброс вручную. Кроме того, на данный момент ваша программа попадает в строку}, память будет освобождена.

Смежные вопросы