来自 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 上打印一些信息(但您仍然可以在宏中执行此操作)。这里有很多缺点,仅举几例:
- 你可能会忘记调用这个函数而导致内存泄漏
- 有些指针删除后还能用
- 如果只是一个小 object 漏水,很难发现
- 您可以调用错误的函数(例如删除常规指针的数组)
更好用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/