c++ - 我是否需要释放使用 'new' 时分配的 wchar 内存,或者 delete[] 是否也释放它?

标签 c++ arrays struct delete-operator

试图找到释放内存的正确方法,但我找不到明确的答案。我确定它就在那里,但我似乎找不到它而且我有点困惑。

这就是我正在做的。我从 sUsers 创建一个新的 sStructUsers,然后我为用户名分配内存

    struct sStructUsers 
        {
        TCHAR *sName;
        };

    sStructUsers *sUsers = new sStructUsers[TOTALUSERS]();

    // Allocate memory for the TCHARs in sStruct
    for (INT k = 0; k < TOTALUSERS; k++)
        {
        sUsers [k].sName =  (TCHAR*)calloc(128,sizeof(TCHAR))
        }

接下来,我对 sName 成员做任何我需要做的工作

    // do work here

现在,要进行清理,我应该这样做吗:

    delete[] sUsers;

或者我应该这样做吗?

    for (INT k = 0; k < TOTALUSERS; k++)
        {
        free(sUsers[k].sName);
        }
    delete[] sUsers?

我不确定我是否需要释放内存或者 delete[] 是否会处理它?<​​/p>

最佳答案

不要使用 new如果你能帮忙的话。大多数情况下在现代 C++ 中 new不需要。 您可以使用 std::vector , std::array , std::string (std::basic_string<TCHAR> 可能),std::unique_ptrstd::shared_ptr .

如果你觉得你真的需要使用 new ,创建一个特殊的类来处理这个。 IE。例如制作new在构造函数和 delete在析构函数中。

当然,正如评论中所说,永远不要将 new/delete 与 malloc/free 混为一谈。根本不需要在 C++ 中使用这些函数,因为这是 C 的残余。

编辑:添加示例,说明类本身如何处理。

struct sStructUsers 
{
    const int MAX_NAME_SIZE = 128;
    sStructUsers()
    {
        sName = new TCHAR[MAX_NAME_SIZE];
    }
    ~sStructUsers()
    {
        delete sName;
    }
    TCHAR *sName;
};

那么在使用这个类时你不需要任何初始化/清理。

请注意,您通常甚至不需要这样做,您可以这样定义您的类:

struct sStructUsers 
{
    std::basic_string<TCHAR> sName;
};

并且有完整的string功能免费。或者像这样,如果你真的需要一个指针:

struct sStructUsers 
{
    const int MAX_NAME_SIZE = 128;
    sStructUsers() : sName(new TCHAR[MAX_NAME_SIZE]) {}
    std::unique_ptr<TCHAR[]> sName;
};

或者,正如我之前提到的,使用其他标准容器。

关于c++ - 我是否需要释放使用 'new' 时分配的 wchar 内存,或者 delete[] 是否也释放它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56868467/

相关文章:

c - 如何使用文件操作 malloc 结构数组来执行以下操作?

c++ - 3 个共线点 - 一些错误

c - 从结构体访问数组并将其转换为指针

c++ - 使用 std::future/std::async

c++ - 调用 std::vector<Class type> 的析构函数使 for_each 无效

javascript - 将对象数组转换为与 nodejs/pg/unnest 兼容的数组

arrays - 如何存储在多重图中使用的 ggplots 列表而不覆盖以前的图?

Python:访问与循环数组的当前位置相匹配的移动窗口数组的索引

c++ - Qt 中的智能指针内存管理器

c++ - 为什么 C++ 链接器不提示缺少这些函数的定义?