C++中有三种创建对象 内存分配问题
2016-04-09 16:54
369 查看
我们都知道C++中有三种创建对象的方法,如下:
第一种和第二种没什么区别,一个隐式调用,一个显式调用,两者都是在进程虚拟地址空间中的栈中分配内存,而第三种使用了new,在堆中分配了内存,而栈中内存的分配和释放是由系统管理,而堆中内存的分配和释放必须由程序员手动释放,所以这就产生一个问题是把对象放在栈中还是放在堆中的问题,
基本数据类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。
#include <iostream> using namespace std; class A { private: int n; public: A(int m):n(m) { } ~A(){} }; int main() { A a(1); //栈中分配 A b = A(1); //栈中分配 A* c = new A(1); //堆中分配 delete c; return 0; }
第一种和第二种没什么区别,一个隐式调用,一个显式调用,两者都是在进程虚拟地址空间中的栈中分配内存,而第三种使用了new,在堆中分配了内存,而栈中内存的分配和释放是由系统管理,而堆中内存的分配和释放必须由程序员手动释放,所以这就产生一个问题是把对象放在栈中还是放在堆中的问题,
基本数据类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。
相关文章推荐
- 编程算法 - 迷宫的最短路径 代码(C++)
- 郁金香C++辅助初级班读书笔记
- c++ 子类虚函数、友元函数、复构、构造、赋值=的重写方式 - 练习题
- 栈的C++实现
- C++中函数参数形式的总结
- C++11:MinGW当指定-std=c++11选项时 默认定义了__STRICT_ANSI__
- C语言存储类关键字
- 详解C语言中scanf函数使用的一些注意点
- 关于继承与派生的小结
- C++第三次实验——作业
- C++11(boost)中的原子操作(atomic operation)
- C语言赋值类型的转换
- 算法初探——冒泡排序
- [c++]继承 多态
- C++第三次作业
- 二叉树相关练习题(C++)
- C语言中使用快速排序算法对元素排序的实例详解
- c++ tuple类型
- c++ java相互调用
- C/C++程序的内存分配