【发布时间】:2018-05-17 08:56:26
【问题描述】:
我正在使用库中的一个类。设为A,它有一个字符指针“token”
我的代码:
void someFunction()
{
A a;
cout<<a.token;
anotherFunction(a);
cout<<a.token; // line 4: now token became invalid [1]
}
void anotherFunction(A copyOfA);
{
// doing something
} // on exit destructor of copyofA will be called
[1]为什么会失效:A类如下:
class A
{
char *token;
public:
A()
{
token = GetRandomToken(); // GetRandomToken will return a 'new Char' array
}
~A()
{
if(token != NULL)
{
delete[] token; // it is A's responsibility to delete the memory it created
token = NULL;
}
}
};
在 anotherFunction 中调用 copyOfA 的析构函数 token 被删除。 所以在第 4 行,token 无效,因为 a.token 和 copyOfA.token 都指向同一个地址。
有什么解决办法,在以下情况:
案例 1:class A 在给定的库中:所以我无法修改它。
案例2:如果我可以修改class A:处理这个问题的好方法是什么?
我知道,如果通过传递引用调用 anotherFunction,我就不会遇到这个问题。但是如果我必须在某个时候保留对象的副本怎么办?
在此处查看示例代码:https://ideone.com/yZa4k4
【问题讨论】:
-
class A不遵循rule of 3/5。你不能安全地复制它 -
唯一的解决方法是永远不要创建副本。您只能拥有一个实例并传递指向它的引用或指针。
-
您可以通过正确的实现将
A类包装在另一个类B中,并且永远不要直接使用A。问题是:你打算复制A做什么?复制token指出的内容?或者两个实例应该共享token? -
把图书馆扔掉,因为它太糟糕了。如果你可以修改它,只需给它适当的复制语义
-
为了呼应@PasserBy,把图书馆扔掉,因为如果作者弄错了,那么谁知道他们还弄错了什么?