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 []是否可以处理?
new如果可以帮助,请不要使用。在现代C ++中,大多数情况下new都不需要。您可以使用std::vector,std::array,std::string(std::basic_string<TCHAR>也许),std::unique_ptr或std::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)
或者,正如我前面提到的,请使用其他标准容器。