gpt4 book ai didi

c++ - boost::scoped_ptr 使用其他 scoped_ptr 进行初始化会导致问题。这段代码是否正确

转载 作者:行者123 更新时间:2023-11-28 04:05:50 25 4
gpt4 key购买 nike

我是 boost 库的新手,正在尝试 boost::scoped_ptr,它声明无法复制或移动此智能指针。但是我在玩一些代码时发现了一个问题。我能够创建 scoped_ptr 的新实例并使用现有的有效 scoped_ptr 对其进行初始化。因此,如果 scoped_ptr 的范围之一结束并释放内存,其他 scoped_ptr 仍然认为其有效指针并尝试访问。它在运行时给了我错误。

我正在开发 boost 库版本 1.66,使用 cygwin g++ 编译器并在编译时使用 std=c++03 选项。

#include<boost/scoped_ptr.hpp>
#include<iostream>

using namespace std;

int main(){
boost::scoped_ptr<int> pi(new int(9));
cout << *pi << endl;
cout << uintptr_t(pi.get()) << endl;

boost::scoped_ptr<int> ppi(pi.get()); // initialized with same memory pointed by pi.
cout << *ppi << endl; // so ownership of same memory is with pi.
cout << uintptr_t(ppi.get()) << endl; // as well as with ppi.

pi.reset(new int(12)); //its previous memory location pointing to 9 is deallocated.

cout << *ppi << endl; // throws garbage value..
cout << uintptr_t(ppi.get()) << endl; // shows same memory location it had previous memory shown by pi.

cout << *pi << endl;
cout << uintptr_t(pi.get()) << endl;

return 0;
}

所以下面是编译好的代码运行的快照......

-> g++ -std=c++03 -Wall scoped_ptr.cpp 

-> ./a.exe
9
25769804960
9
25769804960
-2144292696
25769804960
12
25769879920
Aborted (core dumped)

执行结束时显示核心转储,它在上面的运行中错误地显示了 -2144292696

我还检查了 boost::scoped_ptr 是否能够将其分配给指针
int * p = pi.get() 语句编译正常(这应该工作吗?)

上面的操作用其他scoped_ptr初始化scoped_ptr是否有效?

最佳答案

Is above operation initializing scoped_ptr with other scoped_ptr valid?

没有。 Boost documentation阅读:

explicit scoped_ptr(T * p = 0); // never throws

Constructs a scoped_ptr, storing a copy of p, which must have been allocated via a C++ new expression or be 0.

当你用另一个智能指针持有的原始指针初始化一个智能指针时,你不会转移所有权,你只是复制原始指针。因此,该指针将被 delete 多次,这是未定义的行为。

您的代码基本上是这样的:

int* p = new int;
delete p; // when you call pi.reset()
delete p; // when ppi goes out of scope

.get() 返回存储的原始指针。它不检查其有效性。

要转移所有权,您应该移动分配智能指针本身。 std::unique_ptr 和 C++11 的简单示例:

auto p = std::unique_ptr<int>(new int);
// auto p1 = std::unique_ptr<int>(p.get()); // same error
auto p2 = std::move(p); // fine, transfers ownership from p to p2;
// p will not delete the raw pointer it previously held

boost::scoped_ptr 不支持所有权转移。

关于c++ - boost::scoped_ptr 使用其他 scoped_ptr 进行初始化会导致问题。这段代码是否正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58714610/

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