r**a 发帖数: 536 | 1 下面的code中,输出为"Constructor, Constructor, Destructor, 3" 前两个
constructors分别是create b1 and b2是出现的。第3个Destructor应该是对应到“b1
= b2;"。我的问题是此时b2已经被free掉了,为啥最后的结果是3呢?哪位大牛给解释
解释。谢谢了。
#include
#include
#include
#include
class StrBlob
{
public:
typedef std::vector::size_type size_type;
StrBlob();
StrBlob(std::vector &il);
size_type size() const { return data->size(); }
bool empty() const { return data->empty(); }
void push_back(const std::string &t) {data->push_back(t);}
void pop_back();
std::string& front();
std::string& back();
~StrBlob() {std::cout << "Destructor" << std::endl;}
private:
std::shared_ptr > data;
void check(size_type i, const std::string &msg) const;
};
StrBlob::StrBlob(): data(std::make_shared >()) {std
::cout << "Constructor" << std::endl;}
StrBlob::StrBlob(std::vector &il): data(std::make_shared
vector >(il))
{std::cout << "Constructor" << std::endl;}
int main()
{
StrBlob b1;
{
std::vector a(2, "a");
StrBlob b2(a);
b1 = b2;
b2.push_back("about");
}
std::cout << b1.size() <
double temp;
std::cin >> temp;
return 0;
} |
X****r 发帖数: 3557 | 2 首先第3个Destructor对应的是b2.push_back("about");这句之后的}。
因为你用的是shared_ptr,b1=b2;的时候调用的也是share_ptr的copy assignment
operator,所以b1和b2共享同一个vector,你调用b2.push_back和调用
b1.push_back效果是一样的。
b1
【在 r**a 的大作中提到】 : 下面的code中,输出为"Constructor, Constructor, Destructor, 3" 前两个 : constructors分别是create b1 and b2是出现的。第3个Destructor应该是对应到“b1 : = b2;"。我的问题是此时b2已经被free掉了,为啥最后的结果是3呢?哪位大牛给解释 : 解释。谢谢了。 : #include : #include : #include : #include : class StrBlob : {
|
r**a 发帖数: 536 | 3 我做了个test,你说的是对的。那么我confused是到底什么时候smart pointer会被
free掉呢。是说出了scope吗?我原来以为那个reference counter是0就会调用
destructor,现在看是不对的。
【在 X****r 的大作中提到】 : 首先第3个Destructor对应的是b2.push_back("about");这句之后的}。 : 因为你用的是shared_ptr,b1=b2;的时候调用的也是share_ptr的copy assignment : operator,所以b1和b2共享同一个vector,你调用b2.push_back和调用 : b1.push_back效果是一样的。 : : b1
|
X****r 发帖数: 3557 | 4 我不明白你的问题。你有两个StrBlob对象b1和b2,他们各有一个
share_ptr > >成员对象b1.data和b2.data,这两个
share_ptr指向同一份vector。b2析构的时候b2.data也析构,但是
b1.data还指向这份vector,引用计数不为零。
【在 r**a 的大作中提到】 : 我做了个test,你说的是对的。那么我confused是到底什么时候smart pointer会被 : free掉呢。是说出了scope吗?我原来以为那个reference counter是0就会调用 : destructor,现在看是不对的。
|
r**a 发帖数: 536 | 5 哦,现在我知道我哪里理解错了。多谢多谢。
【在 X****r 的大作中提到】 : 我不明白你的问题。你有两个StrBlob对象b1和b2,他们各有一个 : share_ptr > >成员对象b1.data和b2.data,这两个 : share_ptr指向同一份vector。b2析构的时候b2.data也析构,但是 : b1.data还指向这份vector,引用计数不为零。
|