gpt4 book ai didi

c++11 - unique_ptr堆和栈分配

转载 作者:行者123 更新时间:2023-12-02 20:07:29 24 4
gpt4 key购买 nike

原始指针可以指向在堆栈或堆上分配的对象。

堆分配示例:

// heap allocation
int* rawPtr = new int(100);
std::cout << *rawPtr << std::endl; // 100

堆栈分配示例:

int i = 100;
int* rawPtr = &i;
std::cout << *rawPtr << std::endl; // 100

使用 auto_ptr 进行堆分配示例:

int* rawPtr = new int(100);
std::unique_ptr<int> uPtr(rawPtr);
std::cout << *uPtr << std::endl; // 100

使用 auto_ptr 进行堆栈分配示例:

int i = 100;
int* rawPtr = &i;
std::unique_ptr<int> uPtr(rawPtr); // runtime error

“智能指针”是否旨在用于指向堆上动态创建的对象?对于 C++11,我们是否应该继续使用原始指针来指向堆栈分配的对象?谢谢。

最佳答案

智能指针通常用于指向分配有 new 的对象并用 delete 删除。它们不必以这种方式使用,但如果我们想猜测语言结构的预期用途,这似乎就是意图。

上一个示例中代码崩溃的原因是“用 delete 删除”部分。当它超出范围时,unique_ptr 将尝试 delete它有一个指针指向的对象。由于它是在堆栈上分配的,因此失败。就像你写的那样,delete rawPtr;

由于人们通常将智能指针与堆对象一起使用,因此有一个函数可以一次性在堆上分配并转换为智能指针。 std::unique_ptr<int> uPtr = make_unique<int>(100);将执行第三个示例的前两行的操作。还有一个匹配的make_shared用于共享指针。

可以将智能指针与堆栈对象一起使用。您要做的就是指定智能指针使用的删除器,提供一个不调用 delete 的删除器。 。由于它是一个堆栈变量并且无需执行任何操作即可删除它,因此删除器无能为力。这不禁让人问,如果智能指针所做的只是调用一个不执行任何操作的函数,那么它还有什么意义呢?这就是为什么您通常不会看到智能指针与堆栈对象一起使用。但这里有一个显示一些有用性的示例。

{
char buf[32];
auto erase_buf = [](char *p) { memset(p, 0, sizeof(buf)); };
std::unique_ptr<char, decltype(erase_buf)> passwd(buf, erase_buf);

get_password(passwd.get());
check_password(passwd.get());
}
// The deleter will get called since passwd has gone out of scope.
// This will erase the memory in buf so that the password doesn't live
// on the stack any longer than it needs to. This also works for
// exceptions! Placing memset() at the end wouldn't catch that.

关于c++11 - unique_ptr堆和栈分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42910711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com