类与动态内存分配中布局new操作符
来源:互联网 发布:恒腾网络 福利待遇 编辑:程序博客网 时间:2024/04/30 10:08
const int BUF = 512 ;
class JustTesting
{
private :
JustTesting(const string & s = " Just Testing" , int n = 0 )
{
}
~ JustTesting(){
}
public :
};
int main()
{
char * buffer = new char [BUF];
JustTesting * pc
*pc2, * pc3, * pc4;
pc1 = new (buffer) JustTesting;
pc2 = new JustTesting( " Heap1 " , 20 );
pc3 = new (buffer + sizeof (JustTesting)) JustTesting(" Bad Idea " ,6 ); // 此处用一个JustTesging对象大小的偏移量避免pc3与pc1占用同一块内存,因为如果类动态的为其成员分配内存,占用同一内存将会产生问题。
pc4 = new JustTesting( " Heap2 ", 10 )
delete pc2;
delete pc4;
delete [] buffer;
return 0 ;
}
以上代码片断中,pc1和pc3为布局new操作符来分配内存,而pc2和pc4为常规new操作符来分配内存 。
对于常规new操作符分配的内存,可以直接使用:delete pc2;这样的语句操作来释放内存。
而对于布局new操作符分配的内存就不能这样做:delete pc1;
因为pc1和pc3并没有直接收到new操作符返回的地址,而是由布局操作符指向了buffer的地址,new/delete系统知道已分配的512字节块buffer,但对布局new操作符对该内存块做了何种处理一无所知。
另一方面,buffer的地址是用new []初始化的,因此必须使用delete[]而不是delete。
注意:即使buffer是使用new而不是new[]初始化的,delete pc1 也将释放buffer,而不是pc1。
以上的代码确实释放了buffer:delete [] buffer;
但是由此产生了新的问题,它没有为布局new操作符在该内存块中创建的对象调用析构函数,我们只需要在析构函数中放入一段显示语句就可以清楚的看到,程序并没有销毁“JustTesting”和“Bad Idea”,也就是pc1和pc3指向的对象。
那么这里就需要我们显式的为布局new操作符创建的对象调用析构函数。正常情况下将自动调用析构函数,这是需要显示调用析构函数的少数几种情况之一。
显式调用析构函数时,必须指定要销毁的对象。由于有指向对象的指针,因此可以这样写:
pc3->~JustTesting();
pc1->~JustTesting();
把这段代码放到delete [] buffer;之前,这段程序才算完整无错。
C++ 类在堆中分配内存空间
#include<
.h>
class animal
{
public:
animal()
{
cout<<"animal构造函数\n";
}
virtualvoid eat()//将函数eat()声明为虚函数
{
cout<<"动物会吃\n";
}
};
void
()
{
animal*p;
p=new animal;//类在堆中分配内存空间
p->eat();
delete p;
}
回复:类在堆中分配内存空间
c++里面, 创建对象, ClassName object(初始化参数);在Stack栈里面分配空间,自动释放。
或者用 ClassName object=new ClassNam();在heap堆里面分配空间,要手动释放。
- 类与动态内存分配中布局new操作符
- 关于C++类与动态内存分配中布局new操作符
- 关于C++类与动态内存分配中布局new操作符
- 类和动态内存分配,类成员的动态内存分配,new,delete,定位new
- 动态内存分配 new,delete
- 动态内存分配与释放(new and delete)
- 动态内存分配与释放(new and delete)
- 动态内存分配与释放(new and delete)
- 动态内存分配与释放(new and delete)
- 动态内存分配与释放(new and delete)
- 动态内存分配与释放(new and delete)
- new在局部函数中分配的动态内存
- c++中优化内存分配:new/delete操作符;allocator类对象的使用;operator new/operator delete函数及定位new表达式
- C++学习:动态内存分配对象的new/delete运算符与函数malloc/free
- C++中继承与动态内存分配
- C++内存分配操作符new(new operator),operator new,placement new详解
- malloc与new分配内存
- C动态内存分配:(四)malloc与new分配内存大小查看函数:_msize()/malloc_usable_size
- 写给我们这些浮躁的程序员
- 内存对象大会战
- !!ECMA-262 核心
- 栈区,堆区,全局区,文字常量区,程序代码区 详解
- 二、Linux下的vi编辑器
- 类与动态内存分配中布局new操作符
- 卸载chrome后无法安装新的chrome
- C++内存分配
- 深入C++的new
- mysql配置文件my.ini的分析
- 宏
- Sizeof与Strlen的区别与联系
- 关于css hack(参考百度百科)
- VS2008下用C++ OLE技术高效处理Excel数据-总结