簡體   English   中英

如何編寫通用的 function 來刪除任何有效指針?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM