我有这个课:

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用于创建数据成员,因此我不确定是否允许删除该成员。

最佳答案

在C ++中有一个经验法则:


  对于每个new,一个delete


您的代码也不例外。您已经new了一些东西;您必须delete它。

由于container是在new的构造函数中stringlist进行的,因此您应该在delete的析构函数中将其设置为stringlist

您不会直接调用析构函数。1相反,您只允许在对象的常规释放中调用析构函数,无论是通过delete还是通过自动(即“堆栈”)销毁。



1您不直接调用析构函数。:通常。使用placement- new时是一个例外,您在这里没有这样做。如果您不知道是否需要使用placement- new,则不需要。

09-10 04:25
查看更多