C++类析构函数删除成员(如果"owner"?
C++ class destructor delete member if "owner"?
>我知道在C++中,指针就是:指向内存位置的指针,并且没有"所有者"的概念。但请考虑以下情况(不一定是好的代码(:
class A {
public:
A(){}
~A()
{ if(myObject!=nullptr)
delete myObject;
}
void createMember()
{myObject=new CrazyCustomClass();}
CrazyCustomClass *getMember()
{return myObject;}
private:
CrazyCustomClass *myObject=nullptr;
}
如果它有区别,CrazyCustomClass 没有复制构造函数,因为复制它是没有意义的。非常简单 - 我有一个类,在实例化后的某个时候,可能会调用new
来实例化类型CrazyCustomClass *
的成员问题是,如果在某个时候我创建了class A
的副本(这很好 - 我希望能够复制class A
(。删除该副本时,原始类 A 实例化指向的对象也会被删除。例如:
void StupidFunction(A *firstObject){
//This is NOT a real function, it simply illustrates the effect of a third-party library function
//create a new object that is a copy of first object
A secondObject(*firstObject);
<do whatever with second object>
//secondObject goes out of scope here and gets deleted.
}
A *firstObject=new A();
firstObject->createMember();
stupidFunction(firstObject);
CrazyCustomClass *customObject=firstObject.getMember(); //this is now an invalid pointer
在上面的例子中,StupidFunction
来自第三方库,其想法是它提供了对象的"临时"副本,您可以使用该副本而不会弄乱原始对象,这很好。Class A
和CrazyCustomClass
都是我的代码,可以随意更改。不幸的是,当删除"临时"副本时,我编写析构函数的方式会导致问题。
我的第一个想法是使用shared_ptr,如下所示:
std::shared_ptr<CrazyCustomClass> sharedObject=std::make_shared<CrazyCustomClass>(new CrazyCustomClass);
。但这在编译时给了我一个错误:
候选构造函数(隐式复制构造函数(不可行:否 已知从"CrazyCustomClass *"到"const CrazyCustomClass"的转换 对于第一个参数;使用 * 取消引用参数
如果我确实用* 取消引用参数,它会给我一个关于"CrazyCustomClass"
的复制构造函数被删除的错误,这是真的 - 没有明智的方法来复制CrazyCustomClass
.
所以我的问题是:我怎样才能重构class A
,以便在firstObject
超出范围时正确删除myObject
,而不是在删除 A 的任何"临时"副本时?
使用shared_ptr
实际上是这个问题的解决方案,但是原始问题中尝试的代码不正确。有两种(至少(不同的方法来初始化shared_ptr
(参考: https://msdn.microsoft.com/en-us/library/hh279669.aspx(。首先,您可以使用new
作为构造函数参数来做到这一点:
shared_ptr<CrazyCustomClass> myObject(new CrazyCustomClass)
其次,这是通常首选的方法,您可以使用 make_shared 函数(如原始帖子中尝试的那样(,它不获取new
对象,而是获取要传递给对象构造函数的参数,在这种情况下什么都没有:
shared_ptr<CrazyCustomClass> myObject=make_shared<CrazyCustomClass>()
原始代码只是混淆了这两个方法,因此出现了关于复制构造函数的错误:它试图实例化一个新的CrazyCustomClass
对象,并带有指向CrazyCustomClass
对象的指针作为构造函数参数。
一旦使用shared_ptr
,析构函数中的delete
必须被删除。
向@tkausl和@alterigel的帽子提示指出问题评论中的错误!
- 如果没有malloc,链表实现将失败
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 如果编译的源代码是特定于它编译的硬件的,我们如何分发它
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- C++擦除(如果存在)
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- 在'如果'陈述输出如何正确
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 如果基类包含双指针成员,则派生类的构造函数
- 如果没有数学库,我如何在C++中创建复利公式
- 如果我已经有一个头,那么模板(-t)文件属于哪里
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- C++类析构函数删除成员(如果"owner"?