【发布时间】:2017-02-16 00:23:27
【问题描述】:
在某些嵌入式情况下,需要使用 memcopy 样式的函数(例如从外部存储器或使用封闭的 API 调用)移动内存。
当这样一个 C++ 对象需要以这种方式移动,但它没有默认构造函数时,你不能这样做,:
class Object {
//local data
public:
Object(/* not a default constructor */){}
}
//elsewhere:
Object o; //compiler will complain here...
memcpy_like_function(src_address, &o, sizeof(o));
因为Object 没有默认构造函数,因此编译器会报错创建Object o。
来自 cmets 中的一些注释:
-
memcpy_like_function类似于 memcpy,它实际上不是 memcpy。src_address不是指向我可以到达的地址的指针,也不是表示指向我可以到达的地址的指针的 int。它是一个 int,表示我无法到达的内存空间中的地址。我访问这个内存空间的唯一方法就是使用这个函数。 -
Object没有默认构造函数,没有虚函数,既不继承自,也不继承任何东西。Object是 trivially copyable。
在这种情况下创建这样一个对象而不把它放在堆上的正确方法是什么?最好,我想获得一个堆栈分配的对象,该对象将在作用域和析构函数中正常运行。对于这个问题,Object 没有继承任何东西。
【问题讨论】:
-
请在否决和投票结束之前发表评论......否则这样做非常粗鲁。
-
@Eichhörnchen:因为它所在的内存位置在封闭的 API 调用之外是不可访问的......
-
@AndrewSpott 近距离投票将包括一个原因 - 有时不需要额外评论
-
@M.M:对不起,我认为接近投票总是需要评论。特别是考虑到这一点是“不清楚要问什么”。如果我不知道问题是什么,我无法解决它。
-
你应该发布一些真正能代表你的情况的东西,否则你确实不清楚你在问什么。
标签: c++ heap-memory memcpy default-constructor