【发布时间】:2012-07-20 13:00:43
【问题描述】:
使用后必须释放结构内存吗?我有示例代码:
struct aa
{
int a;
char * b ;
aa()
{
a=0;
b= new char[255];
}
} ;
aa *ss = new aa[3];
void fill()
{
aa * ssss = new aa;
aa * sss = new aa;
sss->a=10;
ss[0] = *sss;
cout<<ss[0].a<<"\n";
ss[1] = *sss;
cout<<ss[1].a<<"\n";
cout<<ssss[1].a<<"\n";
}
int _tmain(int argc, _TCHAR* argv[])
{
fill();
delete(ss);
}
我必须在fill 的末尾加上delete(ssss) 吗?
我必须删除main末尾的结构数组ss吗?
我必须创建 destruct 还是构造 ss 以释放 *b 内存?
类是一样的逻辑吗?
【问题讨论】:
-
我对所有事情都说不:使用
std::string表示b,使用std::array(或std::vector)表示ss,使用普通对象表示ssss和sss. -
@BenVoigt:有人说是吗?还是您只是在抱怨不必要的括号?
-
@Mike:最终问题是使用
delete,其中需要delete[]。额外的括号向我表明,根本原因是有人认为delete是一个函数。 -
除了其他人已经注意到的问题外,还有未定义行为的次要细节。省略一些不相关的代码,我们有:
aa * ssss = new aa;[ ... ]cout<<ssss[1].a<<"\n";。如果没有中间代码,问题就很明显了——ssss指向一个aa对象,但您试图将其视为(至少)两个的数组。 -
@cHao:糟糕的建议,IMO。而不是添加一个析构函数(实际上,可能是一个复制构造函数和赋值运算符)只需将
aa定义为:struct aa { int a; char b[255]; };