我正在编写C ++ / CLI库。我想尽可能避免使用指针,但是现在我无法避免使用指针。我想编写没有内存泄漏之类的内存安全代码。因此,请看以下示例:
class A; // from library, I don't know about
class ref Class {
public:
retrieveValue();
useValue();
private:
A* value = nullptr; // have to use pointer
}
所以在第一种方法retrieveValue()
中,我从作为值传递的库中获取了A
值:
Class::retrieveValue() {
if(value)
delete value;
A tmp = AHelper::value(); // gives me a value
value = new(tmp);
}
[首先,在其中删除旧值(如果已设置),然后获取一个tmp值,然后用检索到的值实例化我的值。
在useValue()
中,我使用像这样的值:
Class::useValue() {
if(value)
AHelper::something(*value);
}
AHelper
的签名:
A AHelper::value();
void AHelper::something(const A& value);
现在,我不太确定是否正确处理了内存。是否有内存泄漏之类的危险?
这是将传递的值保存在指针中的正确方法,这样它就不会超出范围吗?
由于我的理解,tmp
在retrieveValue
之后无效。所以我需要假设,tmp
被复制到指针指向的有效内存中?
而且此值从未更改过,只能由我的删除调用清除吗?通过取消引用指针的传递也安全吗?
我没有警告,但我觉得代码不安全。
另外,我可以使用任何智能指针执行此任务吗?
听起来好像您正在寻找的内存安全性可以使用std::unique_ptr
(docs)获得。
如果方法retrieveValue
和useValue
对于您的用例很重要,则可以将它们保留在适当的位置,只需将原始指针指向value
的成员std::unique_ptr<A>
的类型替换为。
使用unique_ptr
,可以简化您的方法retrieveValue
,因为在分配新值时,旧值(如果有)会自动释放。