在C ++中删除新结构

时间:2014-10-13 16:11:07

标签: c++ memory-management struct free delete-operator

我在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];
}

释放这些内容的正确方法是什么?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

应该这样做是明智的。正如其他人所指出的那样,它可以自动化。如果没有你应该在析构函数中清理。但是,如果不这样做并回答实际问题,删除新数组的语法是:

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

您当然必须删除新的所有内容,因此在删除元素数组本身之前,您需要循环删除每个元素。你认为有人会用便利型咳嗽载体咳嗽包裹起来。