0

我是 boost 库的新手并正在尝试boost::scoped_ptr,它指出这个智能指针不能被复制或移动。但是我在玩一些代码并发现了一个问题。我能够创建新实例scoped_ptr并使用现有的有效scoped_ptr. 因此,如果其中一个scoped_ptr's 范围已结束并释放内存,则其他 scoped_ptr 仍认为其有效指针并尝试访问。它在运行时给了我错误。

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

#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_pt上述操作是否用其他scoped_ptr有效初始化r?

4

1 回答 1

1

scoped_ptr上述操作是否与其他scoped_ptr有效初始化?

不。Boost 文档内容如下:

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

构造 a scoped_ptr,存储 的副本p,该副本必须已通过 C++new表达式或 be分配0

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

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

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不支持所有权转让。

于 2019-11-05T15:36:52.363 回答