标签: smart-pointers

是否有C++/CLI智能指针项目(例如scoped_ptr)?

是否有C++/CLI RAII智能指针类用于包含托管类型中的本机指针?只是想知道,在我编写自己的clr_scoped_ptr值类模板之前.

我知道微软提供的:

以上两者类似于auto_ptrunique_ptr.

但所有这些都是用于处理托管的ref类实例,而不是用于释放本机对象.

c++-cli smart-pointers

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

c ++堆栈对象的shared_ptr

我最近一直在学习托管指针并遇到以下情况.

我正在为游戏视图实现模型/控制器类.我的观点,将在模型中呈现内容.挺直的.在我的main函数中,我将这三个实例化为:

RenderModel m;
m.AddItem(rect); // rect gets added just fine, it's an "entity" derivee
RenderView v;
v.SetModel(m);
Run Code Online (Sandbox Code Playgroud)

我的渲染视图类非常简单:

class RenderView
{
public:
explicit RenderView();
~RenderView();

void Update();

void SetModel(RenderModel& model);

private:
// disable
RenderView(const RenderView& other);
RenderView& operator=(const RenderView& other);

// private members
boost::scoped_ptr<RenderModel> _model;
};
Run Code Online (Sandbox Code Playgroud)

setView的实现非常标准:

void RenderView::SetModel(RenderModel& model)
{
    _model.reset(&model);
}
Run Code Online (Sandbox Code Playgroud)

关键是,视图将模型存储在智能指针中.但是在main中,模型是在堆栈上分配的.程序退出时,内存将被删除两次.这是有道理的.我目前的理解告诉我,任何存储在smart_ptr(任何类型)中的东西都不应该在堆栈上分配.

完成上述所有设置之后,我的问题很简单:如何指示参数未在堆栈上分配?接受智能指针作为参数唯一的解决方案?即使这样,我也无法确保使用我的视图类的人不能做错误的事情,例如:

// If I implemented SetModel this way:
void RenderView::SetModel(const std::shared_ptr<RenderModel>& model)
{
    _model.reset(&*model);
}

RenderModel m;
RenderView v;
std::shared_ptr<RenderModel> ptr(&m); // create a shared_ptr …
Run Code Online (Sandbox Code Playgroud)

c++ heap stack smart-pointers

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

智能指针不能与Android NDK r8一起使用

我无法弄清楚如何在我的Android项目中使用共享指针.我在Mac OS X上使用最新的Eclipse ADT和Android NDK r8d.

这是我的Android.mk文件中的内容:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CPPFLAGS  := -std=c++11
LOCAL_MODULE    := native
LOCAL_SRC_FILES := native.cpp
include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)

这是我的Application.mk文件中的内容:

NDK_TOOLCHAIN_VERSION=4.7
APP_STL := stlport_shared
Run Code Online (Sandbox Code Playgroud)

我已经尝试了默认的GCC 4.6,实验4.7和clang3.1工具链.
我试过链接到stlport_sharedgnustl_sharedc ++运行时库.
我已经试过了FLAGS -std=c++11,-std=c++0x-std=gnu++11.

我能够使用lambdas和c ++ 11标准的auto,所以C++ 11标志似乎正在工作.但是,无论何时我尝试使用shared_ptr,weak_ptr或unique_ptr,我都会收到错误'suchandsuch_ptr' is not a member of 'std'

我有#include <memory>我的cpp文件.现在Eclipse告诉我Unresolved inclusion: <memory>,但我得到同样的东西<vector>,<string>并且那些似乎编译和工作正常.

智能指针是否未在Android NDK中包含的工具链中实现?
如果没有,为什么不呢?由于GCC和clang已经支持智能指针很长一段时间了,这意味着我要么丢失一些东西,要么Android开发者因为某些原因禁用了它们.
有线索吗?

c++ gcc smart-pointers android-ndk c++11

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

有没有一种安全的方法可以将C++ 11智能指针和原始指针接口一起使用?

我想在新项目中使用C++ 11 Smart Pointers,并遇到问题.许多当前项目仍在其接口中使用原始指针作为参数,并且没有智能指针的接口,例如QMainWindow :: setCentralWidget.

为了保持类型一致,我必须get()像这段一样传递存储的指针:

QMainWindow win;

std::shared_ptr<QWidget> scrollArea{ std::make_shared<QScrollArea>() };
// QScrollArea is a derived class of QWidget.

win.setCentralWidget(scrollArea.get());
Run Code Online (Sandbox Code Playgroud)

但我无法确定Qt中的其他方法是否delete对存储的指针执行运算符scrollArea.

如果Qt中的某些方法可以导致内存泄漏或其他问题吗?

我检查了最新的C++标准CD,但没有发现任何内容.似乎这是一个未定义的行为.

如果这样做是一个未定义的行为并且很危险,是否有一种安全的方法可以使用带有原始指针接口的智能指针?

c++ qt interface smart-pointers c++11

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

C++ 智能指针地址

我对智能指针有点困惑。在下面的代码中, & 运算符应该返回智能指针分配的地址还是它控制的指针的地址?

main() {
    std::shared_ptr<int> i = std::shared_ptr<int>(new int(1));
    std::shared_ptr<int> j = i;
    printf("(%p, %p)\n", &i, &j);
}
Run Code Online (Sandbox Code Playgroud)

运行代码,我得到了不同的地址。如果我使用原始指针运行等效代码,我会得到相同的地址:

main() {
    int e = 1;
    int *k = &e;
    int *l = k;

    printf("(%p, %p)\n",k,l);
}
Run Code Online (Sandbox Code Playgroud)

c++ pointers smart-pointers

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

重新分配智能指针

一般来说做智能指针,如std::unique_ptrGlib::RefPtr当另一个对象重新分配给点删除他们的对象,因为他们持有的是给定的对象(在的情况下,显然隐含的唯一指针std::unique_ptr)?

c++ smart-pointers glib gtkmm c++11

13
推荐指数
2
解决办法
4598
查看次数

如何返回指针(和所有权)的向量C++ 11

我有一个工厂方法,它创建一堆对象并返回指向它们的指针.对象的所有权转移给调用者:

std::vector<animal*> create_zoo();
Run Code Online (Sandbox Code Playgroud)

这有效,但容易出现内存泄漏.

auto zoo = create_zoo();
Run Code Online (Sandbox Code Playgroud)

向量在堆栈上并自动清理,包含的对象不是.

返回各种子类型的对象.撤消值而不是指针是行不通的.

我在考虑使用

std::vector<std::unique_ptr<animal> > create_zoo();
Run Code Online (Sandbox Code Playgroud)

但是unique_ptr没有复制语义,我返回了vectorby值,理论上它创建了一个副本.

我可以放在vector堆上以避免这种情况

std::unique_ptr<std::vector<std::unique_ptr<animal> > > create_zoo();
Run Code Online (Sandbox Code Playgroud)

但这太荒谬了.

这也应该有效:

std::vector<std::shared_ptr<animal> > create_zoo();
Run Code Online (Sandbox Code Playgroud)

这可行,但它并没有真正转移所有权.调用者必须假设可能有其他指向对象的指针.

我愿意接受建议.不需要std::vector.我只是在寻找一种实现工厂的好方法,该工厂使用现代c ++返回多个对象的所有权.我现在正在避免提振.我正在尝试探索新的c ++ 11内容.

c++ pointers smart-pointers vector c++11

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

从类方法返回成员unique_ptr

我试图将一个std::unique_ptr class成员(试图将所有权移动)返回给调用者.以下是示例代码段:

class A {
public:
  A() : p {new int{10}} {}

  static std::unique_ptr<int> Foo(A &a) {
    return a.p; // ERROR: Copy constructor getting invoked
                // return std::move(a.p); WORKS FINE
  }

  std::unique_ptr<int> p;
};
Run Code Online (Sandbox Code Playgroud)

我认为编译器(gcc-5.2.1)能够在这种情况下进行返回值优化(复制省略),而不需要显式的intent via std::move().但事实并非如此.为什么不?

以下代码似乎工作正常,这似乎是等效的:

std::unique_ptr<int> foo() {
  std::unique_ptr<int> p {new int{10}};
  return p;
}
Run Code Online (Sandbox Code Playgroud)

c++ smart-pointers rvo c++11

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

这种std :: make_unique的使用会导致非唯一指针吗?

假设我在C++中有以下代码:

#include <memory>
#include <iostream>

struct Some {
        Some(int _a) : a(_a) {}
        int a;
};

int main() {
        Some some(5);

        std::unique_ptr<Some> p1 = std::make_unique<Some>(some);
        std::unique_ptr<Some> p2 = std::make_unique<Some>(some);

        std::cout << p1->a << " " << p2->a << std::endl;
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,使用唯一指针来保证资源不被共享.但在这种情况下,两个p1p2指向同一个实例some.

请揭开这种情况.

c++ smart-pointers

13
推荐指数
3
解决办法
1714
查看次数

如果智能指针所持有的对象在其他地方被删除会发生什么?

这个问题总是让我很烦恼,特别是当我用Qt编程的时候.由于Qt使用对象所有权树,因此传递指针(例如via)myBoostSharedPtr.get()可以隐式转移所有权.现在考虑一些Qt对象被破坏并且整个对象树被破坏但智能指针仍然存在的情况,例如作为不同类的成员.如果之后智能指针被删除会发生什么?双重删除所有令人讨厌的后果?一些智能指针实现会阻止这种情况吗?

c++ qt smart-pointers

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

标签 统计

smart-pointers ×10

c++ ×9

c++11 ×5

pointers ×2

qt ×2

android-ndk ×1

c++-cli ×1

gcc ×1

glib ×1

gtkmm ×1

heap ×1

interface ×1

rvo ×1

stack ×1

vector ×1