[英]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.