【问题标题】:C++ new and delete ptr wrapper classC++ 新建和删除 ptr 包装类
【发布时间】:2015-09-29 22:52:53
【问题描述】:

有一个问题是关于什么是 C++ 包装类是,我认为他提供了一个很好的答案。他的用户名:来自 Stack Overflow 的 GManNickG 提供了以下代码及其答案:

class int_ptr_wrapper
{
public:
    int_ptr_wrapper(int value = 0) :
    mInt(new int(value))
    {}

    // note! needs copy-constructor and copy-assignment operator!

    ~int_ptr_wrapper()
    {
        delete mInt;
    }

private:
    int* mInt;
};

该代码提示我一个问题。我从几个不同的人那里听说,使用 new 和 delete 关键字被认为是不好的做法。 在某些情况下我应该使用 new 或 delete 吗?另外,如果我像下面这样编写上面的代码,这被认为是更好的做法?

class int_ptr_wrapper
{
public:
    int_ptr_wrapper(int value = 0) :
        m_int(&value) {}
private:
    int* m_int;
};

【问题讨论】:

  • 在您的第二个版本中,m_int 是一个悬空指针。 value 将在构造函数块的末尾被销毁。至于您的问题,只需查找 RAII,它将回答您关于裸新闻和删除不好的问题。

标签: c++ pointers wrapper delete-operator


【解决方案1】:

(几乎)总有比使用new 更好的方法。绝对总有比使用delete 更好的方法。

查看std::shared_ptr<>std::unique_ptr<> 的文档。在它们之间,它们涵盖了您在范围内存管理、内存资源自动释放、文件自动关闭、用于加密的内存自动归零等方面所需要的所有场景。这是因为这两个类都为您提供了提供自定义删除器的机会,因此无论您的内存释放需要多么复杂,它们都可以完美且安全地覆盖。

编写一个完整的作用域内存管理器类比最初看起来更难。 c++ 标准已经为您完成了。没有很好的论据来重新发明那个特定的轮子。

【讨论】:

  • 虽然您的答案是有效的,但它并不能解释为什么 new 或 delete 本身就不好,所以恕我直言,它是不完整的。有人可能会告诉你,几乎总有比使用智能指针更好的方法。你会立刻相信吗?
  • 原谅我。问题没有这么问。我假设 OP 理解直接使用 new/delete 时资源泄漏的影响,但如果没有,我会很乐意更新。
猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 2021-10-03
  • 2020-11-10
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
相关资源
最近更新 更多