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:不,对象由连续的内存块组成,大小固定。当然,你可以将指向内存其他部分的指针粘贴到对象中,但是只有指针是对象的一部分,而不是指针对象。明白了,谢谢。写这篇文章时,我肯定想得不够:)