簡體   English   中英

使用內聯函數在C ++中更安全地刪除指針

[英]Safer delete pointer in C++ with inline function

這個問題 ,我這樣實現

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上打印一些信息(但你仍然可以在宏中執行此操作)。 這里有許多不足之處,僅舉幾例:

  1. 您可以忘記調用此函數並發生內存泄漏
  2. 刪除后,有些人仍然可以使用指針
  3. 如果只有一個小物體泄漏,很難找到
  4. 你可以調用錯誤的函數(例如刪除常規指針的數組)

最好使用std::shared_ptr<T>std::unique_ptr 他們將繼續管理內存並明確誰是內存的所有者(內存所有權是設計類或整個項目時需要考慮的重要事項)。 但要記住智能指針不是一些奇跡,你仍然可以搞砸一些東西。 看一下這篇文章,找出與他們無關的 十大愚蠢錯誤,避免使用C ++ 11智能指針

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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