如果我对某些可用内存块有空*并且我知道至少有sizeof(T)可用,有没有办法在内存中的那个位置创建T类型的对象?
我只是要在堆栈上创建一个T对象并将其存储起来,但似乎必须有一种更优雅的方式来实现它?
答案 0 :(得分:8)
使用新的展示位置:
#include <new>
void *space;
new(space) T();
请记住在释放内存之前将其删除:
((T*)space)->~T();
不要在堆栈上创建对象并将其memcpy,它不安全,如果对象的地址存储在成员或成员中,该怎么办?
答案 1 :(得分:4)
首先,只知道sizeof(T)
内存量可用是不够的。此外,您必须知道void指针已针对要分配的对象类型正确对齐。使用未对齐的指针可能会导致性能损失或崩溃的应用程序,具体取决于您的平台。
但是,如果您知道可用内存和对齐方式正确,则可以使用placement new来构建对象。但请注意,在这种情况下,您还必须明确地销毁它。例如:
#include <new> // for placement new
#include <stdlib.h> // in this example code, the memory will be allocated with malloc
#include <string> // we will allocate a std::string there
#include <iostream> // we will output it
int main()
{
// get memory to allocate in
void* memory_for_string = malloc(sizeof(string)); // malloc guarantees alignment
if (memory_for_string == 0)
return EXIT_FAILURE;
// construct a std::string in that memory
std::string* mystring = new(memory_for_string) std::string("Hello");
// use that string
*mystring += " world";
std::cout << *mystring << std::endl;
// destroy the string
mystring->~string();
// free the memory
free(memory_for_string);
return EXIT_SUCCESS;
}