[英]How do I write a generic function to delete any valid pointer?
以下是我的代码片段。 我正在尝试编写通用 function 来检查指针是否有效并将其删除。
#include <windows.h>
#include <vector>
#include <map>
#include <string>
using namespace std;
struct testStruct
{
int nVal;
_TCHAR tcVal[256];
testStruct()
{
wmemset(tcVal, 0, _countof(tcVal));
}
};
void deletePointer(void *obj)
{
if (obj)
{
delete obj;
obj = NULL;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
testStruct *obj = new testStruct;
wstring *strVal = new wstring();
vector<wstring> *vecVal = new vector<wstring>;
map<wstring,wstring> *mapVal = new map<wstring, wstring>;
//My business logic goes here.
//Finally after all business logic, clearing allocated memory.
deletePointer(obj);
deletePointer(strVal);
deletePointer(vecVal);
deletePointer(mapVal);
return 0;
}
虽然我没有遇到任何编译或运行时错误,只是想确认一下,这是否是检查和删除多个点的正确方法。 我不想在删除之前检查单个指针是否有效。 所以调用通用 function。
提前感谢您的建议。
不存在编译和运行时错误。 只需要确认一下,这是正确的方法还是有更好的方法。
如果您的编译器没有报告此代码的错误,请发出警告: https://godbolt.org/z/7ranoEnMa 。 删除void*
是未定义的行为,您无法预测结果会是什么。 如果它目前没有崩溃,它可能会在您最意想不到的时候随机崩溃。
没必要,因为delete nullptr;
而您的 function 只会检查它。 如果您想检查指针是否真的像 Nathan Pierson 在评论中建议的那样有效(并且您没有始终如一地为它们分配nullptr
),那是不可能的。 您负责您的 memory 管理, if
您在整个程序中没有正确执行此操作,则没有任何帮助。
而且也没有必要,因为memory管理已经帮你做好了。 容器不应该分配在堆上。 简单地做
wstring strVal;
vector<wstring> vecVal;
map<wstring,wstring> mapVal;
并放下指针。 C++ 容器自己完成所有魔法,并且通常本身很小( sizeof(std::vector)
通常是3*sizeof(void*)
)。
假设你真的需要堆上的testStruct
而不是自动存储,你应该使用智能指针:
std::unique_ptr<testStruct> obj = std::make_unique<testStruct>();
在那里,它被创建,分配在堆上,当obj
结束它的 scope 时将被自动删除。你不必再担心delete
任何东西了。
如果你真的想要一个 function 手动delete
s 个对象,它应该是这样的:
template <typename T>
void deletePointer(T*& obj)
{
delete obj;
obj = nullptr;
}
它保留要删除的指针的类型,并使用nullptr
更新传递的指针,因此以后不会无效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.