2017-01-12 5 views
-1

В консольном приложении Win32 (Visual C++) У меня есть массив объектов, и каждый объект содержит некоторые другие объекты и переменные, например. (Владелец и оборудование являются структурами, TimeInfo является класс):Лучший способ удалить утечки памяти

class Order 
{ 
public: 
    Order(); 
    ~Order(); 
    Owner owner; 
    Equipment equipment; 
    char *problem; 
    TimeInfo timeinfo; 
    void write(); 
    int order_number; 
}; 

Следующая У меня есть класс OrderManager, который содержит массив этого объекта:

items = (Order*)(malloc(100 * sizeof(Order))); 

В программе я добавлять и удалять элементы, но Каков наилучший способ освободить память в конце программы? У меня есть free (manager.items) ;, но это не работает.

+4

Почему вы используете 'malloc' для выделения памяти на C++? – UnholySheep

+5

1) Не используйте спам-теги. C не C++ не C. 2) Не используйте функции выделения памяти C в C++. 3) 'malloc'' class' с методами - еще худшая идея. – Olaf

+4

используйте 'std :: vector'. – NathanOliver

ответ

0

Как уже отмечалось, вы должны избегать использования malloc в этой ситуации. Если вы хотите, чтобы выделить 100 экземпляров ордена, вы могли бы попробовать что-то вроде этого:

Order* items = new Order[100]; 

В этом случае конструктор по умолчанию Приказа вызывается для каждого экземпляра.

Если вы хотите, чтобы освободить память, вы делаете:

delete[] items; // note the "[]" 

Предположительно, вы хотите обрабатывать заказы в пределах OrderManager, поэтому типичное место для новой/удаления будет в construtor/деструктор OrderManager.

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

С malloc и бесплатным все, что происходит, это выделение памяти в куче.

В своем вопросе вы упомянули, что

free(manager.items); 

не работает. Разве вы не должны освобождать указательные элементы вместо manager.items?

+0

Плохой совет, продвигает старые методы, подверженные ошибкам, вместо 'std :: vector'. –

-2

Я бы использовал деструктор для управления освобождением памяти, выделенной в классе OrderManager.

Вы должны использовать C++ new и delete для выделения/освобождения памяти, а также использовать контейнеры для хранения коллекций объекта.

Обратитесь к этой ссылке для списка опций, как вы можете инициализировать вектор: https://stackoverflow.com/a/6143009/3817744

class OrderManager { 
private: 
    std::vector<Order> items; 
public: 
    OrderManager() { 
     // Refer to the link above 
    } 
    ~OrderManager() { 
     items.clear(); 
    } 
} 

Вот ссылка на интересный пост о новом оператора С ++ Дэвид Mazieres. http://www.scs.stanford.edu/~dm/home/papers/c++-new.html

+0

Пожалуйста, не рекламируйте использование 'malloc' в C++. И не используйте C-style cast. И 'new []' не является * новым C++-стилем * * - новый стиль C++ не должен вручную выделять динамические массивы, а использовать для него контейнеры, например: 'std :: vector' – UnholySheep

+1

Использование' malloc' является неправильно. 'Order' не является POD-типом, и использование' malloc' для создания 100 из них не будет создавать объекты 'Order'. – PaulMcKenzie

+0

Спасибо, я обновлю. – bicole

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