我正在尝试更新我的一些代码,并尝试包含make_shared.
我创建了一个名为Mail的类来发送电子邮件,现在我试图包含它:
auto m = std::make_shared<Mail>();
Run Code Online (Sandbox Code Playgroud)
问题是我正在使用Makefile:
SHELL = /bin/sh
SYSTEM = $(shell uname)
C++ = g++
CC = gcc
DFLAGS = -DGHOST_MYSQL
OFLAGS = -O3
LFLAGS = -lmysqlclient_r -lboost_date_time -lboost_thread -lboost_system -lboost_filesystem -lgmp
CFLAGS = -std=c++0x
Run Code Online (Sandbox Code Playgroud)
编译器还包含此标志:
g++ -o mail.o -std=c++0x -O3 mail.cpp
Run Code Online (Sandbox Code Playgroud)
但我得到以下错误:
error: 'make_shared' is not a member of 'std'
auto m = std::make_shared<Mail>();
^
error: expected primary-expression before '>' token
auto m = std::make_shared<Mail>();
^
error: expected primary-expression before ')' token
auto m = …Run Code Online (Sandbox Code Playgroud) 我不明白为什么一个具有已删除的复制构造函数的类(或包含成员,如ifstream,具有已删除的复制构造函数,并且它也具有已删除的复制构造函数)的类不能与make_shared()一起使用?这段代码显示了我在说什么
class X {
private:
X(const X&) = delete;
int x;
public:
X(int an_int) : x{an_int} {};
X() : x{10} {}
};
int main(int argc, char** argv)
{
// fails because X has no copy constructor
shared_ptr<X> ptr { make_shared<X>( X{8} ) };
shared_ptr<X> ptr2 { new X{10} };// works fine
return 0;
}
Run Code Online (Sandbox Code Playgroud) 考虑两个班级
class A{
public:
int i;
A(){}
explicit A(const int ii):i(ii){}
virtual ~A(){
cout<<"~A - "<< i <<endl;
}
virtual void inc(){
i++;
cout<<"i: "<<i<<endl;
}
};
class B: public A{
public:
int j;
B(){}
explicit B(const int jj, const int ii=-1):A(ii), j(jj){}
~B(){
cout<<"~B - "<<i<<", "<<j<<endl;
}
void inc(){
A::inc();
j++;
cout<<"j: "<<j<<endl;
}
};
Run Code Online (Sandbox Code Playgroud)
现在我们可以这样做main():
A *pa = new B();
//...
pa->inc(); // implements B::inc();
Run Code Online (Sandbox Code Playgroud)
现在使用boost库的版本
boost::shared_ptr<A> pa = boost::make_shared<B>(2);
//...
pa->inc(); // …Run Code Online (Sandbox Code Playgroud) 我的问题是:是否存在share_ptr引用计数为0,而weak_ptr引用计数不为0的情况?
C++中make_shared和普通shared_ptr的区别
引用这个线程,显示如果一个shared_ptr是由weak_ptr创建的,make_shared并且有weak_ptr,它的控制块将是活动的,until shared_ptr和weak_ptr的引用计数都为0。它说:
必须有一种方法让weak_ptr 确定托管对象是否仍然有效(例如锁)。他们通过检查拥有托管对象(存储在控制块中)的shared_ptr 数量来做到这一点。结果是控制块一直处于活动状态,直到共享指针计数和弱指针计数都达到 0。
我做了一个快速测试。我希望shared_ptr创建的make_shared,如果有weak_ptr指向它,control block在shared_ptr被破坏后它仍然会保存。
#include<memory>
#include<iostream>
using namespace std;
struct My {
int m_i;
My(int i) : m_i(i) { cout << "My ctor:" << m_i << '\n';}
~My() { cout << "My ctor:" << m_i << '\n';}
};
weak_ptr<My> wp1, wp2;
int main() {
{
auto sp1 = shared_ptr<My>(new My(30));
wp1 = weak_ptr<My>(sp1);
}
cout<< wp1.use_count() << endl;
{
auto sp2 = make_shared<My>(40); …Run Code Online (Sandbox Code Playgroud) 当std::make_shared(new Foo())调用它时,它构造一个Foo并std::shared_ptr<Foo>为调用者返回一个(即这里).如果从各种对象多次调用它,它new Foo()每次构造一次吗?在这种情况下,它是否与每个调用者获得对新对象的单个引用没有什么不同,在实用性上像unqiue_ptr一样?
或者它Foo()是第一次创建一个然后随后返回std::shared_ptr它,知道它将像一个单独的类型(当然删除一旦最后一个std::shared_ptr被删除)?这个平台是否具体?
特别是这样的功能:
std::shared_ptr<Foo> makeFoo()
{
return std::make_shared<Foo>();
}
Run Code Online (Sandbox Code Playgroud) make-shared ×5
c++ ×3
c++11 ×3
compilation ×1
inheritance ×1
makefile ×1
reference ×1
shared-ptr ×1
weak-ptr ×1