C++ 处理C++/C结构内存释放
我必须在使用结构内存后释放它吗?我有示例代码:C++ 处理C++/C结构内存释放,c++,c,C++,C,我必须在使用结构内存后释放它吗?我有示例代码: 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
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);
}
struct aa
{
INTA;
char*b;
aa()
{
a=0;
b=新字符[255];
}
} ;
aa*ss=新aa[3];
填空()
{
aa*ssss=新aa;
aa*sss=新aa;
sss->a=10;
ss[0]=*sss;
cout如果使用new
,则必须使用delete
以避免内存泄漏。如果在堆栈上声明变量,则在退出作用域时将自动释放该变量
void something();
{
aa b = new aa();
// Do something
delete b; // You must use delete
}
void something();
{
aa b();
// Do something
// You don't have to use delete
}
在您的特定情况下,严格来说没有必要使用删除
,因为程序无论如何都会终止,所有分配的内存都将由操作系统释放
这样做仍然是一个很好的做法,以便保持一致性(尽管在某些特定情况下,您不希望这样做,因为释放大量复杂对象可能需要一些时间,从而减慢程序的终止)
无论如何,使用裸指针在C++中不是一个好主意,因为有许多所谓的智能指针(例如代码> SyddYPPT/<代码>和 UnQuyJPTR >代码>,它们负责调用析构函数,并在内存超出范围后释放内存。
PS:在您的代码中,您将出现内存泄漏,因为aa
结构在构造函数中使用new
,而不在析构函数中调用delete
我必须在填写结束时删除(ssss)吗
是的,您必须删除使用new
创建的任何内容。但是,此处不需要使用new
,只需将其设置为自动:
void fill() {
aa ssss; // automatically destroyed on exit from the function
}
我必须删除main末尾结构的ss数组吗
是,但它是一个数组,因此必须作为数组删除:
delete [] ss;
^^
但同样,没有理由动态分配:
aa ss[3]; // automatically destroyed on exit from the program
我必须创建析构函数还是构造释放*b内存的ss
如果您确实希望使用原始指针来管理动态数组,则可以。您还需要考虑复制构造函数和复制赋值运算符(根据)来确保类的安全使用。或者,使用智能指针或容器来管理内存:
struct aa
{
int a;
std::vector<char> b ;
aa() : a(0), b(255) {}
} ;
struct aa
{
INTA;
std::载体b;
aa():a(0),b(255){}
} ;
那么类呢?它的逻辑是一样的吗
是的,规则总是一样的:使用new
创建的任何对象都必须使用delete
销毁。如果尽可能避免动态分配,并在确实需要时使用智能指针、容器和其他类,则管理对象会容易得多。Yes
请,请,请释放你的内存。我这里不详细介绍,但看看这个答案:
在C/C++
中的经验法则:
- 分配了
new
?使用delete
- 分配了
malloc
,calloc
,realloc
?使用free(void*)释放内存
我会对一切说不:对b
使用std::string
,std::array
(或std::vector
)对于ss
,以及ssss
和sss
的普通对象@BenVoigt:有人说过吗?或者你只是在抱怨不必要的括号?@Mike:最后的问题是使用delete
wheredelete[]
是必需的。额外的括号告诉我根本原因是有人认为delete
是一个函数。除了其他人已经注意到的问题外,还有一些未定义行为的小细节。忽略一些不相关的代码,我们有:aa*ssss=new aa;
[…]cout@cHao:错误的建议,依我看。与其添加析构函数(实际上可能是复制构造函数和赋值运算符),不如将aa
定义为:struct aa{int a;char b[255];}
使用auto_ptr
是不被鼓励的,有充分的理由。如果使用c++11,我建议改为使用unique_ptr
,否则它要么是共享的
要么是boostunique_ptr
是的,很多程序喜欢在关机时释放每一点点内存。虽然我能理解这种诱惑,但作为一个用户,我个人如果某个线程被卡住了,我就不必等待几秒钟……或者永远等待。我完全无法理解编写不必要代码的诱惑,尤其是不必要的代码,这些代码困难、笨拙、凌乱、复杂,需要在每个操作系统/多核环境上进行测试,以确保它仍然工作,并且不会向应用程序添加任何内容ntime功能。代码越多,错误就越多:(