我有以下程序 -C++移动的unique_ptr一个struct构件
#include <iostream>
#include <memory>
class Person
{
public:
Person(const std::string& name):
name(name) { }
~Person() { std::cout << "Destroyed" << std::endl; }
std::string name;
};
typedef struct _container
{
std::unique_ptr<Person> ptr;
}CONTAINER;
void func()
{
CONTAINER* c = static_cast<CONTAINER*>(malloc(sizeof(CONTAINER)));
std::unique_ptr<Person> p(new Person("FooBar"));
c->ptr = std::move(p);
std::cout << c->ptr->name << std::endl;
}
int main()
{
func();
getchar();
return 0;
}
该程序打印 “FooBar的”。我希望程序在func()返回时打印“销毁”,但不会。有人可以帮我解释为什么在这种情况下不会发生这种情况吗?
啊,我明白了。由于malloc'd区域不是“智能”,因此程序不跟踪“c”跟踪跟踪唯一指针范围的方式。 –
@Jai Prabhu是的,我认为这是正确的。 – javaLover
不好 - 比这更糟的是,将一个malloc'd缓冲区转换为具有构造函数的类型是未定义的行为 - 并且该程序允许产生它喜欢的任何垃圾。 –