在Win32控制台应用程序(Visual C ++)中,我有一个对象数组,每个对象包含一些其他对象和变量,例如。 (所有者和设备是结构,TimeInfo是类):
class A {
public:
A(const char* p) : p_{std::strdup(p)} { }
A(const char* p) &&
: p_{p} {
}
~A() { free(p_); }
~A() && { /* nothing */ }
A& append(const A&);
private:
char* p_;
};
接下来我有类OrderManager,它包含这个对象的数组:
class Order
{
public:
Order();
~Order();
Owner owner;
Equipment equipment;
char *problem;
TimeInfo timeinfo;
void write();
int order_number;
};
在程序中,我添加和删除项目,但在程序结束时释放内存的最佳方法是什么?我有免费的(manager.items);但是这不起作用。
答案 0 :(得分:0)
正如人们已经指出的那样,在这种情况下你应该避免使用malloc。如果你想分配100个Order实例,你可以尝试这样的事情:
Order* items = new Order[100];
在这种情况下,为每个实例调用Order的默认构造函数。
如果要释放内存,请执行以下操作:
delete[] items; // note the "[]"
据推测,您希望处理OrderManager中的订单,因此新/删除的典型位置将在OrderManager的construtor /析构函数中。
使用new和delete时,将调用con和析构函数。 调用con和析构函数非常重要,因为它们通常用于设置和初始化构造中的东西并在销毁时释放内容。
使用malloc和free,所有发生的事情都是在堆上分配内存。
在你提出的问题中你提到了
free(manager.items);
不起作用。难道你不能释放指针项而不是manager.items吗?
答案 1 :(得分:-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();
}
}
这是一篇关于DavidMazières关于C ++新运营商的有趣帖子的链接。 http://www.scs.stanford.edu/~dm/home/papers/c++-new.html