标签: smart-pointers

容器中的智能指针如std :: vector?

我正在学习有关智能指针(std::auto_ptr),只是看这里这里是智能指针(std::auto_ptr)不应该在容器(即放std::vector),因为即使大多数编译器不会抱怨,这似乎是正确的.没有规则说智能指针不会在内部复制(vector例如按类)并传输其所有权,然后指针将变为NULL.最后,一切都会搞砸.

实际上,这种情况多久发生一次?

有时我有指针的向量,如果在将来我决定我想要一个智能指针的矢量我会选择什么?

我知道C++ 0x和Boost库,但是现在,我更倾向于坚持使用STL方法.

c++ pointers smart-pointers std auto-ptr

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

C++ - 在初始化类成员之前运行一个函数

我有2个资源管理类DeviceContext,OpenGLContext都是class DisplayOpenGL.资源生命周期与之相关DisplayOpenGL.初始化看起来像这样(伪代码):

DeviceContext m_device = DeviceContext(hwnd);
m_device.SetPixelFormat();
OpenGLContext m_opengl = OpenGLContext(m_device);
Run Code Online (Sandbox Code Playgroud)

问题是调用SetPixelFormat(),因为我无法在DisplayOpenGLc'tor 的初始化列表中执行此操作:

class DisplayOpenGL {
public:
    DisplayOpenGL(HWND hwnd)
    : m_device(hwnd),
      // <- Must call m_device.SetPixelFormat here ->
      m_opengl(m_device) { };
private:
    DeviceContext m_device;
    OpenGLContext m_opengl;
};
Run Code Online (Sandbox Code Playgroud)

我能看到的解决方案:

  • 插入m_dummy(m_device.SetPixelFormat())- 无法工作,因为SetPixelFormat()没有retval.(如果它有一个retval,你应该这样做吗?)
  • unique_ptr<OpenGLContext> m_opengl;而不是OpenGLContext m_opengl;.
    然后初始化为m_opengl(),在c'tor体中调用SetPixelFormat()并使用m_opengl.reset(new OpenGLContext);
  • SetPixelFormat()来自DeviceContextc'tor的 电话

哪种解决方案更可取?为什么?我错过了什么?

我在Windows上使用Visual Studio 2010 Express,如果重要的话.

编辑:我最感兴趣的是在决定使用其中一种方法时所涉及的权衡.

  • m_dummy() 不工作,即使它会显得不优雅
  • unique_ptr<X>对我来说很有意思 …

c++ constructor initialization smart-pointers initialization-list

19
推荐指数
2
解决办法
5152
查看次数

查找由智能指针引起的内存泄漏

有没有人知道发现智能指针引起的内存泄漏的"技术"?我目前正在开发一个用C++编写的大型项目,该项目大量使用带引用计数的智能指针.显然我们有一些由智能指针引起的内存泄漏,它们仍然在代码中的某处被引用,因此它们的内存不会被释放.很难找到带有"不必要"引用的代码行,导致相应的对象不被释放(尽管它不再使用).

我在网上找到了一些建议,建议收集参考计数器的递增/递减操作的调用堆栈.这给了我一个很好的提示,哪一段代码导致参考计数器增加或减少.

但我需要的是某种算法将相应的"增加/减少调用堆栈"组合在一起.在删除这些调用堆栈之后,我希望(至少)剩下一个"增加调用堆栈",它向我显示带有"不必要"引用的代码段,这导致相应的对象不被释放.现在修复泄漏没什么大不了的!

但有人想知道进行分组的"算法"吗?

开发在Windows XP下进行.

(我希望有人理解,我试图解释......)

EDIt:我说的是循环引用造成的泄漏.

c++ pointers memory-leaks smart-pointers

18
推荐指数
2
解决办法
9934
查看次数

C++智能指针性能

使用智能指针多少钱,特别是boost :: shared_ptr在时间和内存方面与裸指针相比成本更高?对于游戏/嵌入式系统的性能密集型部分,是否更好地使用裸指针?您是否建议使用裸指针或智能指针来处理性能密集型组件?

c++ boost smart-pointers

18
推荐指数
3
解决办法
7739
查看次数

Qt中的智能指针

就像它已经写在这里 Qt到目前为止有8个特定的智能指针类.它看起来就像你需要的一切.但是,为了使用这些智能指针中的任何一个,您的类必须从QObject派生,这并不总是方便的.在Qt中是否有其他智能指针实现可以与任意类一起使用?

c++ qt smart-pointers

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

CComPtr在CC中使用CComQIPtr有什么用?

任何人都可以解释一下,CComPtr在CC中使用CComQIPtr有什么用?

CComPtr<ISampleInterface> Sample1;
CComQIPtr<ISampleInterface> Sample2;
Run Code Online (Sandbox Code Playgroud)

com atl smart-pointers visual-c++

18
推荐指数
2
解决办法
8580
查看次数

unique_ptr VS auto_ptr

可能重复:
std :: auto_ptr到std :: unique_ptr有
哪些C++智能指针实现可用?

让我说我有这个struct:

struct bar 
{ 

};
Run Code Online (Sandbox Code Playgroud)

当我像这样使用auto_ptr:

void foo() 
{ 
   auto_ptr<bar> myFirstBar = new bar; 
   if( ) 
   { 
     auto_ptr<bar> mySecondBar = myFirstBar; 
   } 
}
Run Code Online (Sandbox Code Playgroud)

然后在auto_ptr<bar> mySecondBar = myFirstBar;C++中将所有权从myFirstBar传输到mySecondBar,并且没有编译错误.

但是当我使用unique_ptr而不是auto_ptr时,我得到编译器错误.为什么C++不允许这样?这两个智能指针之间的主要区别是什么?什么时候需要用什么?

c++ smart-pointers c++11

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

C++对象池,它提供项目作为智能指针,在删除时返回到池

我正在玩c ++ - 想法,并且对这个问题有点困惑.

我想要一个LIFO管理资源池的类.当请求资源(通过acquire())时,它返回对象作为unique_ptr删除后的对象,导致资源返回到池中.

单元测试将是:

// Create the pool, that holds (for simplicity, int objects)
SharedPool<int> pool;
TS_ASSERT(pool.empty());

// Add an object to the pool, which is now, no longer empty
pool.add(std::unique_ptr<int>(new int(42)));
TS_ASSERT(!pool.empty());

// Pop this object within its own scope, causing the pool to be empty
{
  auto v = pool.acquire();
  TS_ASSERT_EQUALS(*v, 42);
  TS_ASSERT(pool.empty());
}

// Object should now have returned to the pool
TS_ASSERT(!pool.empty())
Run Code Online (Sandbox Code Playgroud)

基本实现,除了重要的最终测试外,将通过测试:

template <class T>
class SharedPool …
Run Code Online (Sandbox Code Playgroud)

c++ pool smart-pointers c++11

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

make_unique value是否初始化char数组

例如 -

#include <memory>

int main(){
    const auto bufSize = 1024;
    auto buffer = std::make_unique<char[]>(bufSize);
}
Run Code Online (Sandbox Code Playgroud)

这里的缓冲区是否已经填充了'\0'字符,或者我必须手动填充它以避免垃圾值.

什么可能的方法,这样就std::memset(&buffer.get(), 0, bufSize)足够了?

c++ memory smart-pointers c++11 c++14

18
推荐指数
3
解决办法
5236
查看次数

如何将智能指针传递给函数?

将对象传递给函数时,相同的规则是否适用于智能指针以及包含动态内存的其他对象?

例如,当我传递std::vector<std::string>给函数时,我总是考虑以下选项:

  1. 我将改变矢量对象的状态,但我希望在函数完成后反映这些更改,AKA进行复制.

    void function(std::vector<std::string> vec);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我要改变矢量对象的状态,我确实希望在函数完成后反映这些更改,AKA做出参考.

    void function(std::vector<std::string> & vec);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 这个对象非常大,所以我最好传递一个引用,但是告诉编译器不要让我改变它.

    void function(std::vector<std::string> const& vec);  
    
    Run Code Online (Sandbox Code Playgroud)

现在这与智能指针的逻辑相同吗?什么时候应该考虑移动语义?关于如何通过智能指针的一些指导是我最想要的.

c++ smart-pointers parameter-passing unique-ptr c++11

17
推荐指数
3
解决办法
2万
查看次数