foo.h
#include <iostream>
#include <memory>
class Bar
{
public:
Bar() {};
~Bar() {};
void print() {
std::cout << "hello";
}
};
class Foo
{
public:
Foo();
~Foo();
void use() {
pteste->print();
}
private:
std::unique_ptr<Bar> pteste;
};
#endif
main.cpp
#include <memory>
#include "foo.h"
int main(int argc, char *argv[])
{
Foo s;
s.use();
return 0;
}
为什么以及如何“正常”工作?
谢谢
编辑:我了解不完整的类型,但是当我可以使用 unique_ptr 而不使用 new 时会发生什么以及为什么有效
EDIT2:针对我的问题更好地组织代码
最佳答案
简短回答:这不起作用。
这个reference表示 std::unique_ptr 的默认构造函数创建一个空的唯一指针,这意味着它没有关联的对象。
这段代码之所以打印hello
是因为这条语句
std::cout << "hello";
不需要任何Bar
。它也可以是静态方法。也许编译器内联该函数并用 std::cout
语句替换 s.use()
。但即使它确实调用了该方法,您也不会注意到任何错误,因为它根本不访问 Bar
的内存。
对你的类稍作改变,你就会明白我的意思:
class Bar
{
public:
Bar() : data(10) {};
~Bar() {};
void print() {
std::cout << "hello, data is: " << data;
}
int data;
};
现在,print
访问无效内存,因为您从未调用new
(或者更好:make_unique
)。它甚至可以工作并向控制台打印一些内容,但 data
的输出将是垃圾。如果幸运的话,应用程序将会崩溃。
它似乎有效的另一个原因(感谢 Stas):
std::unique_ptr
定义了 operator->
,它只是返回所包含的指针,但不检查指针是否指向有效内存。所以 pteste->
不会抛出异常。
关于c++ - 如何工作 - 没有 new 的指针/Unique_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22217387/