c++ - 使用内联函数在 C++ 中更安全地删除指针

标签 c++

来自 this question , 我是这样实现的

Utils.h:

template<class T>
void SafeDeleteWithoutClass(T* &pVal) {
    std::cout << __FUNCTION__ << std::endl;
    delete pVal;
    pVal = nullptr;
}

template<class T>
void SafeDeleteArrayWithoutClass(T* &pVal) {
    std::cout << __FUNCTION__ << std::endl;
    delete[] pVal;
    pVal = nullptr;
}

main.cpp

#include "Utils.h"
struct Foo {
    Foo() {std::cout << __FUNCTION__ << std::endl;}
    ~Foo() {std::cout << __FUNCTION__ << std::endl;}
}
int main()
{
    Foo *pObj = new Foo();
    SafeDeleteWithoutClass<Foo>(pObj2);
    return 0;
}

效果很好。但是我团队中的一些人说它并不真的比宏好。我不知道是否有任何例子可以证明这种方式比宏更好。你能给我一个提示吗?

最佳答案

它并不比宏好,因为你不能保证它会在删除和删除所有东西后让你免于使用指针。它的工作原理几乎相同。我猜这些人只是认为它不是更好,因为它是一样的。它只是在不使用宏的情况下编写的。

这里唯一的优势是您可以在 std::cout 上打印一些信息(但您仍然可以在宏中执行此操作)。这里有很多缺点,仅举几例:

  1. 你可能会忘记调用这个函数而导致内存泄漏
  2. 有些指针删除后还能用
  3. 如果只是一个小 object 漏水,很难发现
  4. 您可以调用错误的函数(例如删除常规指针的数组)

更好用std::shared_ptr<T>std::unique_ptr .他们将继续管理内存并明确谁是内存的所有者(内存所有权是设计类或整个项目时需要考虑的重要事项)。但是请记住,智能指针并不是什么神奇的东西,您仍然可以搞砸一些事情。看看这篇文章,找出对他们不要做什么的事情Top 10 dumb mistakes to avoid with C++ 11 smart pointers

关于c++ - 使用内联函数在 C++ 中更安全地删除指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48513843/

相关文章:

c++嵌套迭代器问题通过结构 vector

c++ - 在 cygwin 上使用 cmake 链接到 Boost 文件系统时出错

c# - C++ 或 C# : Reading commands from a Human Interface Device(HID)

c++ - 在 C++ 中,这是做什么用的?节点* &head,

c++ - 通过防火墙代理将 Arduino 连接到 Internet

c++ - 在 C++ 中将 std::wstring 转换为 const *char

c++ - 停止异步连接

c++ - 从类型 ‘foo*&’ 的右值初始化类型 ‘foo*’ 的非常量引用无效?

c++ - 从 long 转换的 C++ bitset 构造函数的复杂性是什么?

php - Poco 的 HTTPServer 是否存在 PHP SAPI?