84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
C和C++什么东西在什么时候要申请内存和释放内存(我知道的指针要释放,用delete释放)?怎么申请怎么释放?问一个具体的问题,请不要鄙视我。Object obj;Object* obj = new Object();两种情况下,不用的时候我要释放它吗?怎么释放?还有一个问题,比如我的对象成员有一个字符串类型的或者指针类型的变量,我在释放这个对象之前要先释放成员吗?这一步是不是必须的?
闭关修行中......
假设用到C风格的字符串char*,一般是需要自己分配内存的,申请当然是使用new然后释放使用delete咯。如果没有用到new,这一部分内存空间就是在栈上开辟的,就不需要管内存释放的问题,如果是想这样子
Object* obj = new Object();
这里的obj当然要使用delete释放内存,或者可以使用智能指针帮你管理这一部分内存,这样就不用手动的调用delete了如果你的对象有一个指针类型的成员变量,一般情况下你只需要把释放内存的步骤写到析构函数里面就是了,就是把delete的步骤写到析构函数里面。一般来说释放成员指针变量的内存是必须的,因为不释放那就是泄露了。不过注意这里使用成员指针有一个坑,当你需要拷贝这种类型的对象,需要你正确重载拷贝构造函数,否则会造成double free的错误。
当然是要用的时候申请内存不用的时候释放内存。用指针会崩溃当然就不要用裸指针了,C++里那么多智能指针干吗不用呢?以你评论里的代码为例,你写成这样就不纠结了:
std::unique_ptr<Object> ptr(new Object(...)); ptr->...
然后你就不用写delete了,而且这个ptr超出作用域之后new出来的Object也自动干掉了。多好。
Object obj;这种方式对象是在栈空间不需要自己手动去释放,函数栈执行完会自动释放.Object* obj = new Object();这种方式需要手动释放.delete obj就行了.至于你说的obj中存在指针这种方式, 我想你学面向对象肯定学过析构函数吧,调用delete obj的时候其实就是会事先调用析构函数,在析构函数中将指针成员free(或者delete)掉就行了
自己申请的内存都需要自己释放。一般在需要可变的空间时动态申请
假设用到C风格的字符串char*,一般是需要自己分配内存的,申请当然是使用new然后释放使用delete咯。
如果没有用到new,这一部分内存空间就是在栈上开辟的,就不需要管内存释放的问题,如果是想这样子
这里的obj当然要使用delete释放内存,或者可以使用智能指针帮你管理这一部分内存,这样就不用手动的调用delete了
如果你的对象有一个指针类型的成员变量,一般情况下你只需要把释放内存的步骤写到析构函数里面就是了,就是把delete的步骤写到析构函数里面。
一般来说释放成员指针变量的内存是必须的,因为不释放那就是泄露了。
不过注意这里使用成员指针有一个坑,当你需要拷贝这种类型的对象,需要你正确重载拷贝构造函数,否则会造成double free的错误。
当然是要用的时候申请内存不用的时候释放内存。
用指针会崩溃当然就不要用裸指针了,C++里那么多智能指针干吗不用呢?
以你评论里的代码为例,你写成这样就不纠结了:
然后你就不用写delete了,而且这个ptr超出作用域之后new出来的Object也自动干掉了。
多好。
Object obj;这种方式对象是在栈空间不需要自己手动去释放,函数栈执行完会自动释放.
Object* obj = new Object();这种方式需要手动释放.delete obj就行了.
至于你说的obj中存在指针这种方式, 我想你学面向对象肯定学过析构函数吧,调用delete obj的时候其实就是会事先调用析构函数,在析构函数中将指针成员free(或者delete)掉就行了
自己申请的内存都需要自己释放。一般在需要可变的空间时动态申请