最好的方法是删除内存泄漏

时间:2017-01-12 15:27:52

标签: c++ pointers

在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);但是这不起作用。

2 个答案:

答案 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