Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Can';t删除自定义类(C+;+;)的堆实例_C++_Templates_Heap_Destructor - Fatal编程技术网

C++ Can';t删除自定义类(C+;+;)的堆实例

C++ Can';t删除自定义类(C+;+;)的堆实例,c++,templates,heap,destructor,C++,Templates,Heap,Destructor,以下是我得到的: class MyClass { int holder; public: MyClass() { holder = 5; } }; 基本上,我所有的delete命令都会抛出错误。我错过了什么?我需要手动实现析构函数,因为我在堆上创建了一堆东西-正确吗?您永远不会存储新表达式的结果。您的代码可能如下所示: First() { T* tmp; for (int i = 0; i < 20; i++) {

以下是我得到的:

class MyClass {
    int holder;
public:
    MyClass() {
        holder = 5;
    }
};


基本上,我所有的
delete
命令都会抛出错误。我错过了什么?我需要手动实现析构函数,因为我在堆上创建了一堆东西-正确吗?

您永远不会存储
新表达式的结果。您的代码可能如下所示:

First() {
    T* tmp;
    for (int i = 0; i < 20; i++) {
        tmp = new T();
        items.push_back(*tmp);
        delete tmp;              // result of "new" is still accessible here
    }
}

~First() { }
First() {
    for (int i = 0; i < 20; i++) {
        items.push_back(T());
    }
}
First() : items(20) {}

您永远不会存储
新表达式的结果。您的代码可能如下所示:

First() {
    T* tmp;
    for (int i = 0; i < 20; i++) {
        tmp = new T();
        items.push_back(*tmp);
        delete tmp;              // result of "new" is still accessible here
    }
}

~First() { }
First() {
    for (int i = 0; i < 20; i++) {
        items.push_back(T());
    }
}
First() : items(20) {}

为什么不使用智能指针呢?在第一类中,您不需要任何新的或删除的指针<代码>项目。向后推(T())足以向向量添加新的T。向量会自动删除它包含的元素。@Marcin这不是一个好建议,因为不应该有指针。您在堆上创建对象,然后将这些对象的副本推送到向量中,然后泄漏堆对象,然后尝试删除副本(但做得不对)。不要那样做。代码等价于:
T*T=newt();T copy=*T;删除副本。。。我希望看到它的这种形式能说明它有多么明显的错误。为什么不使用智能指针呢?在第一堂课中,你不需要任何新的或删除的<代码>项目。向后推(T())足以向向量添加新的T。向量会自动删除它包含的元素。@Marcin这不是一个好建议,因为不应该有指针。您在堆上创建对象,然后将这些对象的副本推送到向量中,然后泄漏堆对象,然后尝试删除副本(但做得不对)。不要那样做。代码等价于:
T*T=newt();T copy=*T;删除副本。。。我希望看到它的这种形式表明它是多么明显的错误。好吧,我想我现在明白了。显然,您的方式要好得多(不需要堆)。然而,在我将拷贝推入向量之前,对吗?堆中的对象是否可能是不在堆中的结构的“一部分”(我希望我问得很清楚)。@maxmackie:不,对象由连续的内存块组成,大小固定。当然,你可以将指向内存其他部分的指针粘贴到对象中,但是只有指针是对象的一部分,而不是指针对象。明白了,谢谢。写这篇文章的时候我肯定想得不够:好吧,我想我现在明白了。显然,您的方式要好得多(不需要堆)。然而,在我将拷贝推入向量之前,对吗?堆中的对象是否可能是不在堆中的结构的“一部分”(我希望我问得很清楚)。@maxmackie:不,对象由连续的内存块组成,大小固定。当然,你可以将指向内存其他部分的指针粘贴到对象中,但是只有指针是对象的一部分,而不是指针对象。明白了,谢谢。写这篇文章时,我肯定想得不够:)