c++ - 堆分配对象的 setter

标签 c++ memory memory-management heap-memory getter-setter

<分区>

暗示有一个由分配在堆中的对象组成的类。

class A
{
public:
    A() { m_b = new B; m_c = new C; }
    virtual ~A() { delete m_b; delete m_c; }

    inline B* b() const { return m_b; }
    inline C* c() const { return m_c; }

private:
    B* m_b;
    C* m_c;
}

哪种 setter 最适合此类代码?

我想出了这个,

inline void setB(B* b) const { delete m_b; m_b = b; }
inline void setC(C* c) const { delete m_c; m_c = c; }

但是有一个问题。如果我们添加了一个非堆变量或只是一个我们不必使用此 setter 删除的变量,它将在下一次调用 setter 后被删除,这种情况会导致错误或意外行为。

我们也不能直接删除对象,因为 getter 有 const 修饰符。此外,它也不安全,因为类的用户可能不知道内部对象是否分配在堆中。

你能解释一下如何对堆分配的对象使用 setter 吗?

最佳答案

不要使用原始的 newdelete。请改用智能指针 - 它们更安全且更易于使用。在您的情况下,std::unique_ptr 看起来是个不错的选择:

class A
{
public:
    A() : m_b{std::make_unique<B>()}, m_c{std::make_unique<C>()} { }
    virtual ~A() = default;

    inline B* b() const { return m_b.get(); }
    inline C* c() const { return m_c.get(); }

private:
    std::unique_ptr<B> m_b;
    std::unique_ptr<C> m_c;
}

然后您的 setter 可以简单地是:

void setB(std::unique_ptr<B>&& b) { m_b = std::move(b); }
void setC(std::unique_ptr<C>&& c) { m_c = std::move(c); }

关于c++ - 堆分配对象的 setter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53868367/

相关文章:

c++ - 从文件中添加不正确

c++ - 如何使用 shared_ptr 避免内存泄漏?

android - cv::cvtColor 没有分配内存问题

c - OpenCL - clCreateBuffer 大小错误。可能的解决方法?

c++ - 删除 std::tr1::unordered_map 中的元素

c++ - 程序化 QGraphicsView 滚动未正确更新

c - 如何在 C 中释放 char*

c++ - 在 C++ 中存储局部变量和临时变量的存储术语是什么?

iphone - 帮助在 UIWebview 中加载大图像?

java - 如何在 x64 windows7 上为 tomcat 分配超过 1 GB 的内存