从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;
}
效果很好。但我团队中的一些人说它并不比宏观好。我不知道是否有任何证明这种方式的例子比宏更好。你能给我一个暗示吗?
答案 0 :(得分:2)
它并不比宏更好,因为你不能保证在删除和删除所有内容后它会使你不再使用指针。它的工作原理基本相同。我猜这些家伙只是觉得它不是更好,因为它是一样的。它只是在没有使用宏的情况下编写的。
这里唯一的优点是你在std :: cout上打印一些信息(但你仍然可以在宏中执行此操作)。这里有许多不足之处,仅举几例:
最好使用std::shared_ptr<T>
和std::unique_ptr
。他们将继续管理内存并明确谁是内存的所有者(内存所有权是设计类或整个项目时需要考虑的重要事项)。但要记住智能指针不是一些奇迹,你仍然可以搞砸一些东西。看一下这篇文章,找出不要做的内容Top 10 dumb mistakes to avoid with C++ 11 smart pointers