何时删除动态分配的内存

时间:2013-11-06 15:32:12

标签: c++

我有这堂课:

class stringlist {
public:
    typedef std::string str;
    void push(str);
    void pop();
    void print();
    void resize(size_t);
    size_t capacity();
    size_t size();
    stringlist() : N(15) {}
    stringlist(size_t sz) : N(sz) {}
private:
    size_t N;
    str* container = new str[N];
};

以下是测试课程的测试程序:

stringlist slist(16);
slist.push("One");
slist.push("Two");
slist.push("Three");
std::cout << "Capacity: " << slist.capacity() << std::endl;
std::cout << "List size: " << slist.size() << std::endl;
slist.print();

我不确定何时以及如何删除动态管理的内存。我需要调用析构函数~stringlist() { delete [] container; }吗?由于new用于创建数据成员,因此我不确定是否允许删除该成员。

3 个答案:

答案 0 :(得分:3)

C ++中有一条经验法则:

  

对于每个newdelete

您的代码也不例外。你有new个东西;你必须delete

由于containernew的构造函数中被stringlist编辑,您应该在delete的析构函数中stringlist

你不直接调用析构函数。 1 相反,你只需允许在对象的正常释放中调用析构函数,通过delete或通过自动(即, “堆积”)破坏。


1 您不直接调用析构函数。:通常。使用展示位置时遇到例外情况 - new,您在这里没有这样做。如果您不知道是否需要使用展示位置 - new,那么您就不会。

答案 1 :(得分:2)

您主要有两种情况:

  • 在堆栈上分配的变量。当编译器超出范围时,编译器将自动解除分配。在解除分配时,注意不要访问变量(例如,通过指针)。

  • 通过 new 语句在堆上分配的变量。在这里,当不再需要变量时,您必须显式调用 delete 。注意不要创建内存泄漏(即通过 new 分配的变量,不再被引用,因此无法删除)。

您的代码是第一种示例。

对于第二种情况,如果您不想记住需要删除哪些变量(以及何时),您可以使用智能指针(可在Boost库中获得,或者本机在C ++ 11标准中使用)。有关详细信息,请参阅here

答案 2 :(得分:2)

简单的规则:

  • 将任何new / new []与删除/删除[]
  • 配对
  • 或将删除委托给智能指针(例如std :: unique_ptr或std :: shared_ptr)

修复案例:

stringlist() : N(15), container(new str[N]) {}
stringlist(size_t sz) : N(sz), container(new str[N]) {}
// and
~stringlist() { delete [] container; }
// and
private:
size_t N;
str* container;