我在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];
}
释放这些内容的正确方法是什么?
答案 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;
您当然必须删除新的所有内容,因此在删除元素数组本身之前,您需要循环删除每个元素。你认为有人会用便利型咳嗽载体咳嗽包裹起来。