2014-10-13 3 views
-2

У меня багги поведение в коде C++, которое, как представляется, вызвано неправильным освобождением динамически созданных структур. В структуры являются в виде:Удаление новых структур в C++

typedef struct 
{ 
    char *value; 
} Element; 

typedef struct 
{ 
    int num; 
    Element **elements; 
    int *index; 
} Container; 

Они созданы так:

Element *new_element(int size) 
{ 
    Element *elem = new Element; 
    elem->value = new char[size]; 
    return elem; 
} 

Container *new_container(int num) 
{ 
    Container *cont = new Container; 
    cont->num = num; 
    cont->elements = new Element*[num]; 
    cont->index = new int[num]; 
} 

Что такое правильный способ освободить их?

+11

Самый простой способ - переписать код на C++, не используя указатели и не вызовы 'new'. Тогда вам не придется беспокоиться о том, чтобы освободить что-нибудь. – juanchopanza

+5

Вы знаете, я использовал список вопросов, которые можно было бы решить, просто используя 'std :: vector' вместо' new [] '. Если бы я не прекратил поддерживать его в обновлении несколько месяцев назад, мой жесткий диск VPS был бы полным. – rightfold

ответ

6

Вы можете легко исправить все проблемы, освобождая от управления ресурсами аутсорсингового компилятора:

#include <cstdlib> 
#include <string> 
#include <vector> 

struct Element { 
    Element() = default; 
    explicit Element(std::size_t size) : value(size, '\0') { } 

    std::string value; 
}; 

struct Container { 
    explicit Container(std::size_t size) : elements(size), index(size) { } 

    std::vector<Element> elements; 
    std::vector<int> index; 
}; 

Для всех ваших будущих проблем в области управления ресурсами, см The Definitive C++ Book Guide and List.

+0

Это может быть путь. Я не уверен, что понимаю синтаксис. Как вы могли бы написать это, если бы структура была инициализирована более чем одним параметром? Скажем: 'typedef struct {int a; int b} Element; 'Выполнено так, что нет необходимости удалять и освобождать? – Schemer

3

должен сделать это разумным путем. Как указывали другие, его можно сделать автоматическим. В противном случае вы должны очистить деструкторы. В противном случае, однако, и ответить на актуальный вопрос, синтаксис для удаления нового массива является:

int x = new x[20]; 
delete [] x; 

Вы, конечно, придется удалить все, что новые, так что вам придется перебрать элементы удаляя каждый один в свою очередь перед удалением самого массива элементов. Вы бы подумали, что кто-то обернул бы это в удобном типе cough vector cough.

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