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

Jef*_*ffR 0 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))
        }
Run Code Online (Sandbox Code Playgroud)

接下来,我需要对sName成员进行任何工作

    // do work here
Run Code Online (Sandbox Code Playgroud)

现在,要执行清理操作:

    delete[] sUsers;
Run Code Online (Sandbox Code Playgroud)

还是我这样做?

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

我不确定是否需要释放内存,或者delete []是否可以处理?

skl*_*ott 5

new如果可以帮助,请不要使用。在现代C ++中,大多数情况下new都不需要。您可以使用std::vectorstd::arraystd::stringstd::basic_string<TCHAR>也许),std::unique_ptrstd::shared_ptr

如果您确实需要使用new,请创建一个特殊的类来处理此问题。即例如new在构造函数和delete析构函数中进行make 。

当然,正如评论中所述,切勿将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;
};
Run Code Online (Sandbox Code Playgroud)

然后,使用此类时无需任何初始化/清除。

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

struct sStructUsers 
{
    std::basic_string<TCHAR> sName;
};
Run Code Online (Sandbox Code Playgroud)

并具有string免费的全部功能。或者像这样,如果您确实需要一个指针:

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

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