Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 处理C++/C结构内存释放_C++_C - Fatal编程技术网

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
where
delete[]
是必需的。额外的括号告诉我根本原因是有人认为
delete
是一个函数。除了其他人已经注意到的问题外,还有一些未定义行为的小细节。忽略一些不相关的代码,我们有:
aa*ssss=new aa;
[…]
cout@cHao:错误的建议,依我看。与其添加析构函数(实际上可能是复制构造函数和赋值运算符),不如将
aa
定义为:
struct aa{int a;char b[255];}
使用
auto_ptr
是不被鼓励的,有充分的理由。如果使用c++11,我建议改为使用
unique_ptr
,否则它要么是
共享的
要么是boost
unique_ptr
是的,很多程序喜欢在关机时释放每一点点内存。虽然我能理解这种诱惑,但作为一个用户,我个人如果某个线程被卡住了,我就不必等待几秒钟……或者永远等待。我完全无法理解编写不必要代码的诱惑,尤其是不必要的代码,这些代码困难、笨拙、凌乱、复杂,需要在每个操作系统/多核环境上进行测试,以确保它仍然工作,并且不会向应用程序添加任何内容ntime功能。代码越多,错误就越多:(