84669 人が学習中
152542 人が学習中
20005 人が学習中
5487 人が学習中
7821 人が学習中
359900 人が学習中
3350 人が学習中
180660 人が学習中
48569 人が学習中
18603 人が学習中
40936 人が学習中
1549 人が学習中
1183 人が学習中
32909 人が学習中
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)掉就行了
自己申请的内存都需要自己释放。一般在需要可变的空间时动态申请