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

时间:2018-01-30 04:19:49

标签: 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;
}

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

1 个答案:

答案 0 :(得分:2)

它并不比宏更好,因为你不能保证在删除和删除所有内容后它会使你不再使用指针。它的工作原理基本相同。我猜这些家伙只是觉得它不是更好,因为它是一样的。它只是在没有使用宏的情况下编写的。

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

  1. 您可以忘记调用此函数并有内存泄漏
  2. 有些人在删除后仍然可以使用指针
  3. 很难找到只有一个小物体泄漏
  4. 您可以调用错误的函数(例如,删除常规指针的数组)
  5. 最好使用std::shared_ptr<T>std::unique_ptr。他们将继续管理内存并明确谁是内存的所有者(内存所有权是设计类或整个项目时需要考虑的重要事项)。但要记住智能指针不是一些奇迹,你仍然可以搞砸一些东西。看一下这篇文章,找出不要做的内容Top 10 dumb mistakes to avoid with C++ 11 smart pointers