删除传递给构造函数的对象指针导致错误
Deleting a object pointer passed to a constructor function causing an error
我是C++的新手,所以我正试图借助维基百科上的例子来学习它。我玩了一些课,我有一个分段错误。
这是我的代码:
class SomeClass {};
class AnotherClass {
SomeClass* sc
public:
AnotherClass(SomeClass* SC):( sc = SC; ){}
//***********************************************************************
~AnotherClass(){ delete sc; } //here I'm getting rid of internal pointer
//***********************************************************************
};
int main( int argc, char* argv[] ) {
SomeClass* SC = new SomeClass();
AnotherClass* AC = new AnotherClass(SC);
delete AC;
// *****************************************************
delete SC; //i think that this line might cause an error
//******************************************************
return 0;
}
我想,我应该delete
每个指针以获得堆内存空闲?!你能指出我的错误吗。
编辑:
这是我的真实代码:
#include <iostream>
#include <string>
using namespace std;
class Pizza {
string dough;
public:
Pizza(string d):dough(d) {}
void setDough( string value ) { dough = value; }
string getDough() { return dough; }
};
class PizzaBuilder {
Pizza* pizza;
public:
PizzaBuilder( Pizza* p ) { pizza = p; }
~PizzaBuilder() { delete pizza; cout << "PizzaBuilder Destructor." << endl;}
PizzaBuilder* addExtra(string extra) {
string special = pizza->getDough() + " and extra " + extra;
pizza->setDough(special);
return this;
}
Pizza* getPizza() { return pizza; }
};
int main(int argc, char* argv[]) {
Pizza* p = new Pizza("My Special DOVE!");
PizzaBuilder* pb = new PizzaBuilder(p);
pb->addExtra("Mushrooms")->addExtra("Anchovies")->addExtra("Zefir")->addExtra("Chilli");
cout << p->getDough() << endl;
delete pb;
delete p;
return 0;
}
delete
不会删除指针,正如您可能认为的那样。它删除指针指向的对象。因此,您要删除SC
指向的对象两次:一次从main
,另一次从删除时自动调用的AC
指向的对象的析构函数。
多次删除一个对象是未定义的行为。
您需要决定谁拥有该对象。似乎您希望AnotherClass
拥有SomeClass
对象,如果您在析构函数中有delete
,那么您不应该在main()
中使用delete
。双delete
ing导致未定义的行为。
避免这种情况的最好方法是使用std::shared_ptr
,它管理对内存中同一对象的多个引用:
#include <memory>
class SomeClass {};
class AnotherClass {
std::shared_ptr<SomeClass> sc
public:
AnotherClass(std::shared_ptr<SomeClass> SC): sc(SC){}
//***********************************************************************
~AnotherClass(){ /* nothing */}
//***********************************************************************
};
int main( int argc, char* argv[] ) {
std::shared_ptr<SomeClass> SC(new SomeClass());
std::shared_ptr<AnotherClass> AC(new AnotherClass(SC));
return 0;
}
请注意,缺少对delete
的调用。
首先,尽量不要处理原始指针。尤其是在开始C++的时候。请尝试使用值。
也就是说,当您将SC
传递给构造函数时,对象存储指针,因此它有一个指向您在main
中创建的同一对象的指针。在析构函数中,它删除该对象。然后main
也尝试删除该对象。繁荣
相关文章:
- 为什么我在空指针错误(链表)中获取成员访问权限
- std::函数指针错误:无法将 &A::a 转换为类型 std::function<>&&
- 为什么我得到 munmap_chunk():无效的指针:错误
- 成员模板函数指针错误
- 删除指针时,未分配被释放的 C++ 指针错误
- Visual Studio 中的"指向引用的指针"错误不会按发生位置的文件名显示
- C++数组指针错误无法将“int*”转换为“int**”
- C++ 通过函数指针错误调用成员函数
- 从 BST 中删除元素(指针错误)
- 随机生成的多维布尔指针错误
- 在测试中使用unique_ptr时指针错误无效
- 使用 malloc 而不是 new 会导致 free():指针错误无效
- 非标准语法;使用 '&' 创建指向成员的指针错误,将成员函数分配给向量时出错
- 抽象类和唯一指针 c++ 错误
- 返回函数指针错误而不带类型定义
- 练习中出现空指针错误
- 指针错误导致的分段错误(简单..)
- free():C++中的指针错误无效
- 使用布尔值数组"表达式必须具有指向对象类型的指针"错误C++
- 指针错误的C 数组