c,c++中如何做到在指定内存地址创建对象实例
如题,最好有小例子说明
[解决办法]
用 placement new:
#include <new>
A* pa = new (地址) A;
[解决办法]
lz,你是哪里遇到这个的?
primer里面的高级主题部分有这个详细的解释,
关于内存管理的。
[解决办法]
#include <iostream>
using namespace std;
typedef char byte;
int main()
{
byte *buffer = new byte[1000];
int *pi = new(buffer)int[10];
pi[0] = 3;
cout<<(int)*buffer<<endl;
delete []buffer;
return 0;
}
//输出结果是3,说明内存的分配是在buffer里边的,其实也不能称之为内存分配,是在已经分配好的一部分内存空间里边来划分。
#include <iostream>
typedef char byte;
using namespace std;
int main()
{
byte *buffer = new byte[1000];
int *p1 = new(buffer)int[10];
p1[0] = 3;
//输出第一个元素的值
cout<<(int)*buffer<<endl;
int *p2 = new(buffer)int[10];
p2[0] = 4;
//赋值以后输出第一个元素的值
cout<<(int)*(buffer)<<endl;
//再次输出第一个元素的值
cout<<p1[0]<<endl;
//输出这些地址
cout<<(int)buffer<<endl;
cout<<p1<<endl;
cout<<p2<<endl;
delete []buffer;
return 0;
}
//发现,两次的内存分配都是从buffer的首地址开始的,所以我猜测,buffer里边仅仅允许分配一个(一组)对象的内存。
#include <iostream>
using namespace std;
class Integer
{
private:
int datum;
int a,b,c,d;
public:
Integer(int ival = 0)
{
a = b = c = d = datum = ival;
}
Integer(Integer const& rhs)
{
datum = rhs.datum;
}
Integer& operator = (Integer const& rhs)
{
datum = rhs.datum;
return *this;
}
~Integer()
{
cout << "~Integer" << endl;
}
operator int () const
{
return datum;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
int const ELEMENT_COUNT = 8;
unsigned char *buffer = new unsigned char [ELEMENT_COUNT * sizeof(Integer) + sizeof(int)];
Integer *data = new (buffer) Integer[ELEMENT_COUNT];
for (int i = 0; i < ELEMENT_COUNT; i++)
{
data[i].~Integer();
}
delete [] buffer;
return 0;
}
//在申请buffer的时候需要多申请sizeof(int)的内存才不会出错,说明了编译器对用户自定义类型的存储方式---后边需要有sizeof(int)字节的内存来存储分配的空间等信息。