相关疑难解决方法(0)

C++中make_shared和普通shared_ptr的区别

std::shared_ptr<Object> p1 = std::make_shared<Object>("foo");
std::shared_ptr<Object> p2(new Object("foo"));
Run Code Online (Sandbox Code Playgroud)

许多google和stackoverflow帖子就在这里,但我无法理解为什么make_shared比直接使用更有效shared_ptr.

有人可以一步一步解释我创建的对象序列和两者所做的操作,这样我就能理解make_shared效率如何.我在上面给出了一个例子供参考.

c++ shared-ptr c++11

252
推荐指数
5
解决办法
9万
查看次数

是使用shared_ptr.reset还是operator =?

我试图围绕C++ 11的新习语.

似乎至少使用shared_ptr,使用new T()和之间存在实质性差异make_shared<T>().

但是重置共享指针以指向某个新实例的方法呢.以前,我通常会使用reset(new T())会员.但是,这不是因为没有首先使用make_shared()的问题吗?(即它不允许make_shared分配对象,因此它被强制将ref计数放在单独的分配中而不是与T本身相同的分配中?)

是否更好地继续使用:

   mysharedptr = make_shared<T>(args...);
Run Code Online (Sandbox Code Playgroud)

或者,还有更好的方法?

并且不应该像make_shared那样重置提供参数的变量转发,这样就可以编写mysharedptr.reset(args ...);?

c++ shared-ptr c++11

34
推荐指数
2
解决办法
1万
查看次数

如何在构造函数中将weak_ptrs传递给它?

我正在创建一个将成为DAG一部分的类.构造函数将获取指向其他实例的指针,并使用它们初始化依赖项列表.
初始化依赖列表后,只能缩短它 - 实例永远不能作为自身或其任何子项的依赖项添加.

::std::shared_ptr处理这个是很自然的.对处理DAG进行了参考计数.

不幸的是,依赖关系需要知道它们的依赖 - 当依赖关系被更新时,它需要告诉它所有的依赖.
这创造了一个可以打破的微不足道的循环::std::weak_ptr.依赖关系可以忘掉那些消失的家属.

但我无法找到一种方法让依赖::std::weak_ptr者在构建时创建一个自己.

这不起作用:

object::object(shared_ptr<object> dependency)
{
     weak_ptr<object> me = shared_from_this();
     dependency->add_dependent(me);
     dependencies_.push_back(dependency);
}
Run Code Online (Sandbox Code Playgroud)

该代码导致在构造函数退出之前调用析构函数.

有没有一个很好的方法来处理这个问题?我对使用C++ 11的解决方案非常满意.

c++ shared-ptr c++11

9
推荐指数
2
解决办法
3276
查看次数

如何从友元函数访问受保护的构造函数?

我创建了一个类,我想强制任何试图构建对象的人使用unique_ptr.为此,我想到声明构造函数protected并使用friend返回a 的函数unique_ptr.所以这是我想要做的一个例子:

template <typename T>
class A
{
public:
    friend std::unique_ptr<A<T>> CreateA<T>(int myarg);

protected:
    A(int myarg) {}
};

template <typename T>
std::unique_ptr<A<T>> CreateA(int myarg)
{
    // Since I declared CreateA as a friend I thought I
    // would be able to do that
    return std::make_unique<A<T>>(myarg);
}
Run Code Online (Sandbox Code Playgroud)

我做了一些有关朋友函数的阅读,我理解朋友函数可以访问类对象的私有/受保护成员.


无论如何我可以让我的榜样有效吗?

即使没有朋友功能,我的目标也是让某人创建对象CreateA唯一方法.

编辑

我改变了一下代码.我没有提到我的类有一个模板参数.这显然使事情变得更加复杂.

c++ friend-function

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

为什么make_shared不能构造这个对象?

尝试创建指向对象的共享指针时遇到此错误

#include <iostream>
#include <vector>

class Foo {
public:
    std::shared_ptr<Foo> getFoo(int i) {
        auto foo = std::make_shared<Foo>(i);
        //auto foo = std::shared_ptr<Foo>(new Foo(i)); "works"
        return foo;
    }
protected:
    Foo(int i) {std::cout << "foo" << std::endl; }
};

int main(int argc, const char * argv[]) {

}
Run Code Online (Sandbox Code Playgroud)

我收到构建时错误

 Static_assert failed due to requirement 'is_constructible<Foo, int &>::value' "Can't construct object in make_shared"
Run Code Online (Sandbox Code Playgroud)

我可以通过将构造函数设为私有来避免这种情况,但我想知道为什么 make_shared 失败并且 shared_ptr(new) 有效?

c++

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

为什么要使operator new private break std :: shared_ptr?

我正在实现一个A我想要通过它专门管理的多态类型(称之为)std::shared_ptr.要允许shared_from_this在派生类的构造函数中A使用new,请使用然后将成员初始化std::shared_ptr为自身以自动管理其生命周期.为了帮助实现这一点,我决定使特定于类的operator new私有,并计划使用create()辅助函数而不是newmake_shared.设计可能看起来有点滑稽,但在我正在研究的UI库的上下文中是有意义的.最小可重复的例子如下:

struct A {
    A() : m_sharedthis(this) {

    }

    void destroy(){
        m_sharedthis = nullptr;
    }

    std::shared_ptr<A> self() const {
        return m_sharedthis;
    }

private:
    friend std::shared_ptr<A> create();

    std::shared_ptr<A> m_sharedthis;
};

std::shared_ptr<A> create(){
    auto a = new A();
    return a->self();
}
Run Code Online (Sandbox Code Playgroud)

这编译并正常工作.当我将以下代码添加到正文时出现问题A:

struct A {
    ...
private:
    void* operator new(size_t size){
        return ::operator new(size);
    }
    void operator delete(void* ptr){ …
Run Code Online (Sandbox Code Playgroud)

c++ shared-ptr c++11

7
推荐指数
2
解决办法
659
查看次数

在编译时验证对象是否创建为shared_ptr

我编写的类(通常作为其中的一部分boost::asio),其对象依赖于shared_ptr因为它们使用而被包装在a中shared_from_this().有没有办法防止对象被编译,如果它没有被实例化shared_ptr

所以,我正在寻找:

std::shared_ptr<MyClass> a = std::make_shared<MyClass>(); // should compile fine
std::unique_ptr<MyClass> a = std::make_unique<MyClass>(); // compile error
MyClass a; // compile error
Run Code Online (Sandbox Code Playgroud)

c++ shared-ptr boost-asio type-traits c++11

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

为什么我不能在静态函数中访问私有构造函数,如下所示?

我目前正在编写一个弱引用资源管理器,如下所示,编译器抱怨Manager有一个私有构造函数.

我的问题是:为什么我不能在静态函数中访问私有成员函数?

#ifndef TENSOR_MANAGER_H
#define TENSOR_MANAGER_H

#include <memory>
#include <functional>
#include <map>
#include <iostream>

template<typename key_t, typename model_t>
class Manager : public std::enable_shared_from_this<Manager<key_t, model_t> > {
public:
    using self_t = Manager<key_t, model_t>;

public:
    static auto Create() {
        return std::make_shared<self_t>();
    }

public:

    std::shared_ptr<model_t> GetOrAdd(const key_t &&key, const char *data, size_t size) {
        auto pos = m_resources.find(key);
        std::shared_ptr<model_t> tmp;
        if (pos != m_resources.end()) {
            tmp = pos->second.lock();
        }
        if (!tmp) {
            model_t *p = new model_t();

            auto deletor = std::bind(&self_t::releaseItem,
                                     std::weak_ptr<self_t>(this->shared_from_this()),
                                     key, …
Run Code Online (Sandbox Code Playgroud)

c++

6
推荐指数
2
解决办法
476
查看次数

将std :: shared_ptr与受保护的构造函数\析构函数一起使用

可能重复:
如何在只有受保护或私有构造函数的类上调用:: std :: make_shared?

我想创建一个类的共享指针,并有一个工厂方法返回它,同时保持构造函数\析构函数的保护.由于共享指针无法访问构造函数或析构函数,因此出现编译错误.

我正在使用llvm 4.1,但我正在寻找一个可以独立于编译器的解决方案(除了使构造函数\析构函数公开).

这是一个代码示例:

class Foo
{
public:
    static std::shared_ptr<Foo> getSharedPointer()
    {
        return std::make_shared<Foo>();
    }

protected:
    Foo(int x){}
    ~Foo(){}

};
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

c++ shared-ptr c++11

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

私有构造函数和 make_shared

我有一个带有私有构造函数的单例类。在静态工厂方法中,我执行以下操作:

shared_ptr<MyClass> MyClass::GetInstance()
{
    static once_flag onceFlag;

    call_once(onceFlag, []() {
        if (_instance == nullptr)
            _instance.reset(new MyClass());
    });

    return _instance;
}
Run Code Online (Sandbox Code Playgroud)

如果我使用

_instance = make_shared<MyClass>();
Run Code Online (Sandbox Code Playgroud)

该代码无法编译。我的问题是:为什么new可以调用私有构造函数却make_shared不能?

c++ shared-ptr

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

标签 统计

c++ ×10

shared-ptr ×7

c++11 ×6

boost-asio ×1

friend-function ×1

type-traits ×1