placement-new相关内容
我正在尝试理解C++中的placement new-expressions。 This Stack Overflow answer说明T* p = new T(arg);等同于 void* place = operator new(sizeof(T)); // storage allocation T* p = new(place) T(arg); //
..
..
我找不到这个问题的确切答案,因此在这里发布.当我想到向量时,它需要在连续的内存位置构建对象.这意味着向量保持分配的内存,并且必须对被推入其中的对象进行就地构造(=放置新).这是一个有效的假设吗?另外,这是否意味着容器正在手动调用析构函数而不是调用删除?我在这里缺少任何其他假设吗?这是否意味着我可以假设如果我选择编写,即使是为对象编写的自定义 new 也可能不会被调用? 此外,列表使用 new
..
我需要实现一个容器来容纳大量元素,并且由于某种原因,它必须在没有任何堆分配的情况下工作.另一个要求是,不应以任何方式复制或移动容器元素.它们必须直接构造到容器分配的内存中. 为此,我决定使用 Placement new 并将内存管理完全委托给容器实现(在 drdobbs). 此处提供了一个运行示例.(请注意,使用 new uint8_t[size] 和 std::queue 只是为了保
..
我读过这篇我什么时候应该担心对齐?但我是仍然不知道我是否必须担心放置 new 运算符返回的未对齐指针 - 就像在这个例子中: A 类 {上市:长双a;长长 b;A() : a(1.3), b(1234) {}};字符缓冲区[64];int main() {//(buffer + 1) 故意使用错误的对齐方式A* a = new (buffer + 1) A();a->~A();} __alig
..
这个问题来自 this 线程的评论部分,并且在那里也得到了答案.但是,我认为只留在评论部分太重要了.所以我为它做了这个问答. Placement new 可用于在分配的存储中初始化对象,例如, 使用 vec_t = std::vector;自动 p = (vec_t*) 运算符 new(sizeof(vec_t));新(p)vec_t{1、2、3};//在 p 处初始化一个 vec_t
..
出于好奇,以下是否合法? X* p = static_cast(operator new[](3 * sizeof(X)));新的(p + 0)X();新的(p + 1)X();新的(p + 2)X();删除[] p;//我可以在这里使用 delete[] 吗?或者它是未定义的行为? 同样: X* q = new X[3]();(q + 2)->~X();(q + 1)->~X();(q +
..
我现在开始使用 CUDA,不得不承认我对 C API 有点失望.我理解选择 C 的原因,但是如果该语言是基于 C++ 的,那么几个方面会简单得多,例如设备内存分配(通过 cudaMalloc). 我的计划是自己做这个,使用重载的 operator new 和放置 new 和 RAII(两种选择).我想知道到目前为止是否有任何我没有注意到的警告.代码似乎可以工作,但我仍然想知道潜在的内存泄
..
以下在 C++ 中合法吗? 据我所知,Reference 有一个微不足道的析构函数,所以它应该是合法的. 但我认为引用不能合法反弹......他们可以吗? template结构参考{T&r;参考(T&r):r(r){}};int main(){整数 x = 5, y = 6;参考r(x);新的(&r)参考(y);} 解决方案 我想我在下面的一段话中找到了答案,“引用"了一段
..
如果我已经有对象的内存,我可以不使用 new 显式调用构造函数吗? class Object1{字符 *str;上市:对象1(字符* str1){str=strdup(str1);puts("ctor");把(字符串);}〜对象1(){puts("dtor");把(字符串);免费(字符串);}};对象 1 ooo[2] = {Object1("我是第一个对象"), Object1("我是第二个"
..
可能的重复: C++的“placement new” 什么是 C++ 中的就地构造函数? 例如Datatype *x = new(y) Datatype(); 解决方案 这称为放置新操作符.它允许您提供将分配数据的内存,而无需 new 运算符分配它.例如: Foo * f = new Foo(); 上面会为你分配内存. void * fm = malloc(sizeof
..
C++11二月草案的 5.3.4 [expr.new]给出了例子: new(2,f) T[5] 导致调用 operator new[](sizeof(T)*5+y,2,f). 这里,x 和 y 是表示数组分配开销的非负未指定值;new-expression 的结果将从 operator new[] 返回的值偏移这个量.这种开销可以应用于所有数组new-expressions,包括那些
..
我刚刚了解了名为“placement new"的 C++ 构造.它允许您精确控制指针指向内存中的位置.它看起来像这样: #include //必须#include 使用“placement new"#include "Fred.h"//类 Fred 的声明void someCode(){字符内存[sizeof(Fred)];空*地方=记忆;Fred* f = new(place) Fred()
..
这里有人用过 C++ 的“placement new"吗?如果是,是为了什么?在我看来,它只对内存映射硬件有用. 解决方案 Placement new 允许您在已分配的内存中构造一个对象. 当您需要构造一个对象的多个实例时,您可能希望这样做以进行优化,并且每次需要新实例时不重新分配内存会更快.相反,为可以容纳多个对象的内存块执行一次分配可能更有效,即使您不想一次使用所有内存也是如此.
..
考虑以下代码: struct s{const int id;s(int _id):id(_id){}};//...向量v;v.push_back(s(1)); 我收到一个编译器错误,提示“const int id"不能使用默认赋值运算符. Q1.为什么 push_back() 需要赋值运算符? A1.因为当前的 C++ 标准是这样说的. Q2.我该怎么办? 我不想放弃 co
..
为什么是未定义的行为? struct s{const int id;//
..
SomeObj* 缓冲区;char* BufferPtr = MemoryManager::giveMeSomeBytes(resX*resY*sizeof(SomeObj));Buffer = new(BufferPtr) SomeObj[resX*resY]; 当我使用调试器越过这些行时,它会显示变量 Buffer 和 BufferPtr 的值: BufferPtr: 0x0d7f004c
..
在 C 中,可以使用 malloc(sizeof(T) * N) 分配动态数组,然后使用指针算法获取动态数组中 i 偏移处的元素. 在 C++ 中,可以使用 operator new() 以与 malloc() 相同的方式执行类似操作,然后放置 new(例如,可以查看 item 的解决方案13 在 Herb Sutter 所著的“Exceptional C++:47 工程难题、编程问题和解决
..
我有一个为对象分配内存,然后调用其构造函数的方法-内存分配器. 模板内联T * AllocateObject(Arguments ... args){返回new(InternalAllocate(sizeof(T)))T(args ...);} 使用此功能混合按值传递和按引用传递是否有效?例如,使用带有一些按值和一些按引用的构造函数分配类.它可以编译,但是我不确定它
..
在下面的C ++代码中,允许我显式调用析构函数,但不能显式调用构造函数.这是为什么?不会在dtor案件中明确要求更富有表现力和统一吗? class X {};int main(){X * x =(X *):: operator new(sizeof(X));新的(x)X;//选项#1:确定x-> X();//选项#2:错误x->〜X();:: operator delete(x);} 解决
..