繁体   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