这个问题是针对嵌入式系统的!
我有以下选项来初始化一个对象:
Object* o = new Object(arg);
这会将对象放入堆中并返回指向它的指针。我不喜欢在嵌入式软件中使用动态分配。
Object o = Object(arg);
这会在堆栈中创建一个新对象,然后将其复制到对象 o
中,然后将其删除。如果对象大到足以放入 RAM 但放不进堆栈,这可能会导致堆栈溢出。我曾在关闭优化的情况下看到过这种情况,但我没有研究过启用优化后是否有不同。
Object o(arg);
这会在不创建拷贝的情况下创建对象,但是我如何才能再次“初始化”o
?
对于嵌入式,我更喜欢最后一个选项,因为不使用堆,并且堆栈中没有可以造成堆栈溢出的临时对象。
但是我对如何重新初始化对象感到困惑,因为:
o.Object(arg)
不允许。
我可以创建一个名为 init(arg) 的方法并调用
o.init(arg)
它与 Object::Object(arg)
进行相同的初始化,但我宁愿不必创建一个我需要记住的“非标准”名称的额外方法。
有没有办法调用一个已经创建的对象的构造函数来重新初始化它而不用复制?
最佳答案
考虑在对象的当前内存中使用 placement new。这将在当前使用的内存中初始化一个新对象,而无需分配新内存。这可能是适合您的解决方案。例如:
new (&o) Object(args)
试试这个:
#include <iostream>
class A
{
public:
A(int i)
{
m_i = i;
}
int m_i;
};
int main()
{
int s = 10;
int *ps = new (&s) int(100);
std::cout << *ps;
std::cout << s;
A a(5);
new (&a) A(49);
std::cout << a.m_i;
}
g++ -std=c++98 main.cpp
返回 10010049,这是正确的。
关于c++ - (重新)在cpp中没有复制构造函数的情况下初始化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54645483/