标签: make-shared

C++ 11:'make_shared'不是'std'的成员

我正在尝试更新我的一些代码,并尝试包含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)

makefile compilation make-shared c++11

1
推荐指数
1
解决办法
2257
查看次数

为什么std :: make_shared <class T,class ... Args>(Args && ... args)要求T有复制构造函数?

我不明白为什么一个具有已删除的复制构造函数的类(或包含成员,如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)

make-shared c++11

1
推荐指数
1
解决办法
109
查看次数

使用boost :: make_shared和inheritence

考虑两个班级

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)

c++ inheritance make-shared

0
推荐指数
1
解决办法
359
查看次数

如何证明c++11 make_shared()即使在其dtor之后也可以保持shared_ptr的控制块处于活动状态?

我的问题是:是否存在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)

c++ reference shared-ptr weak-ptr make-shared

0
推荐指数
1
解决办法
154
查看次数

std :: make_shared(new Foo())是否会创建单例?

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)

c++ make-shared c++11

-7
推荐指数
1
解决办法
650
查看次数