placement-new相关内容

STL Containers 分配放置新

我找不到这个问题的确切答案,因此在这里发布.当我想到向量时,它需要在连续的内存位置构建对象.这意味着向量保持分配的内存,并且必须对被推入其中的对象进行就地构造(=放置新).这是一个有效的假设吗?另外,这是否意味着容器正在手动调用析构函数而不是调用删除?我在这里缺少任何其他假设吗?这是否意味着我可以假设如果我选择编写,即使是为对象编写的自定义 new 也可能不会被调用? 此外,列表使用 new ..
发布时间:2022-01-24 20:52:14 C/C++开发

如何实现一个具有放置新和就位功能的简单容器?

我需要实现一个容器来容纳大量元素,并且由于某种原因,它必须在没有任何堆分配的情况下工作.另一个要求是,不应以任何方式复制或移动容器元素.它们必须直接构造到容器分配的内存中. 为此,我决定使用 Placement new 并将内存管理完全委托给容器实现(在 drdobbs). 此处提供了一个运行示例.(请注意,使用 new uint8_t[size] 和 std::queue 只是为了保 ..
发布时间:2022-01-24 20:47:22 C/C++开发

使用placement new操作符时我真的需要担心对齐吗?

我读过这篇我什么时候应该担心对齐?但我是仍然不知道我是否必须担心放置 new 运算符返回的未对齐指针 - 就像在这个例子中: A 类 {上市:长双a;长长 b;A() : a(1.3), b(1234) {}};字符缓冲区[64];int main() {//(buffer + 1) 故意使用错误的对齐方式A* a = new (buffer + 1) A();a->~A();} __alig ..
发布时间:2022-01-23 20:26:13 C/C++开发

初始化对象时丢弃放置新返回值是否可以

这个问题来自 this 线程的评论部分,并且在那里也得到了答案.但是,我认为只留在评论部分太重要了.所以我为它做了这个问答. Placement new 可用于在分配的存储中初始化对象,例如, 使用 vec_t = std::vector;自动 p = (vec_t*) 运算符 new(sizeof(vec_t));新(p)vec_t{1、2、3};//在 p 处初始化一个 vec_t ..

CUDA:在 C++ 中包装设备内存分配

我现在开始使用 CUDA,不得不承认我对 C API 有点失望.我理解选择 C ​​的原因,但是如果该语言是基于 C++ 的,那么几个方面会简单得多,例如设备内存分配(通过 cudaMalloc). 我的计划是自己做这个,使用重载的 operator new 和放置 new 和 RAII(两种选择).我想知道到目前为止是否有任何我没有注意到的警告.代码似乎可以工作,但我仍然想知道潜在的内存泄 ..
发布时间:2022-01-10 16:14:35 C/C++开发

是“重新绑定"吗?C++ 中的引用像这样合法吗?

以下在 C++ 中合法吗? 据我所知,Reference 有一个微不足道的析构函数,所以它应该是合法的. 但我认为引用不能合法反弹......他们可以吗? template结构参考{T&r;参考(T&r):r(r){}};int main(){整数 x = 5, y = 6;参考r(x);新的(&r)参考(y);} 解决方案 我想我在下面的一段话中找到了答案,“引用"了一段 ..
发布时间:2022-01-05 12:11:02 C/C++开发

C ++,是否可以直接调用构造函数而无需new?

如果我已经有对象的内存,我可以不使用 new 显式调用构造函数吗? class Object1{字符 *str;上市:对象1(字符* str1){str=strdup(str1);puts("ctor");把(字符串);}〜对象1(){puts("dtor");把(字符串);免费(字符串);}};对象 1 ooo[2] = {Object1("我是第一个对象"), Object1("我是第二个" ..
发布时间:2021-12-30 15:25:00 C/C++开发

什么是 C++ 中的就地构造函数?

可能的重复: C++的“placement new” 什么是 C++ 中的就地构造函数? 例如Datatype *x = new(y) Datatype(); 解决方案 这称为放置新操作符.它允许您提供将分配数据的内存,而无需 new 运算符分配它.例如: Foo * f = new Foo(); 上面会为你分配内存. void * fm = malloc(sizeof ..
发布时间:2021-12-30 15:15:44 C/C++开发

“placement new"有什么用?

这里有人用过 C++ 的“placement new"吗?如果是,是为了什么?在我看来,它只对内存映射硬件有用. 解决方案 Placement new 允许您在已分配的内存中构造一个对象. 当您需要构造一个对象的多个实例时,您可能希望这样做以进行优化,并且每次需要新实例时不重新分配内存会更快.相反,为可以容纳多个对象的内存块执行一次分配可能更有效,即使您不想一次使用所有内存也是如此. ..
发布时间:2021-12-01 14:43:01 C/C++开发

使用 const 成员分配类

考虑以下代码: 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 ..
发布时间:2021-11-30 12:31:33 C/C++开发

将 operator new(sizeof(T) * N) 返回的内存视为数组

在 C 中,可以使用 malloc(sizeof(T) * N) 分配动态数组,然后使用指针算法获取动态数组中 i 偏移处的元素. 在 C++ 中,可以使用 operator new() 以与 malloc() 相同的方式执行类似操作,然后放置 new(例如,可以查看 item 的解决方案13 在 Herb Sutter 所著的“Exceptional C++:47 工程难题、编程问题和解决 ..
发布时间:2021-11-18 02:19:41 C/C++开发

将按引用传递和按值传递混合到可变参数模板函数有效吗?

我有一个为对象分配内存,然后调用其构造函数的方法-内存分配器. 模板内联T * AllocateObject(Arguments ... args){返回new(InternalAllocate(sizeof(T)))T(args ...);} 使用此功能混合按值传递和按引用传递是否有效?例如,使用带有一些按值和一些按引用的构造函数分配类.它可以编译,但是我不确定它 ..
发布时间:2021-04-20 18:43:53 C/C++开发

为什么不能在析构函数可以的同时显式调用构造函数?

在下面的C ++代码中,允许我显式调用析构函数,但不能显式调用构造函数.这是为什么?不会在dtor案件中明确要求更富有表现力和统一吗? class X {};int main(){X * x =(X *):: operator new(sizeof(X));新的(x)X;//选项#1:确定x-> X();//选项#2:错误x->〜X();:: operator delete(x);} 解决 ..