内存管理,将传递的值保存在引用类中,作为以后使用的指针

问题描述 投票:0回答:1

我正在编写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);

现在,我不太确定是否正确处理了内存。是否有内存泄漏之类的危险?

这是将传递的值保存在指针中的正确方法,这样它就不会超出范围吗?

由于我的理解,tmpretrieveValue之后无效。所以我需要假设,tmp被复制到指针指向的有效内存中?

而且此值从未更改过,只能由我的删除调用清除吗?通过取消引用指针的传递也安全吗?

我没有警告,但我觉得代码不安全。

另外,我可以使用任何智能指针执行此任务吗?

c++-cli
1个回答
-1
投票

听起来好像您正在寻找的内存安全性可以使用std::unique_ptrdocs)获得。

如果方法retrieveValueuseValue对于您的用例很重要,则可以将它们保留在适当的位置,只需将原始指针指向value的成员std::unique_ptr<A>的类型替换为。

使用unique_ptr,可以简化您的方法retrieveValue,因为在分配新值时,旧值(如果有)会自动释放。

© www.soinside.com 2019 - 2024. All rights reserved.