试图找到释放内存的正确方法,但我找不到明确的答案。我确定它就在那里,但我似乎找不到它而且我有点困惑。
这就是我正在做的。我从 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_ptr
或 std::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/