我有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
有没有人知道发现智能指针引起的内存泄漏的"技术"?我目前正在开发一个用C++编写的大型项目,该项目大量使用带引用计数的智能指针.显然我们有一些由智能指针引起的内存泄漏,它们仍然在代码中的某处被引用,因此它们的内存不会被释放.很难找到带有"不必要"引用的代码行,导致相应的对象不被释放(尽管它不再使用).
我在网上找到了一些建议,建议收集参考计数器的递增/递减操作的调用堆栈.这给了我一个很好的提示,哪一段代码导致参考计数器增加或减少.
但我需要的是某种算法将相应的"增加/减少调用堆栈"组合在一起.在删除这些调用堆栈之后,我希望(至少)剩下一个"增加调用堆栈",它向我显示带有"不必要"引用的代码段,这导致相应的对象不被释放.现在修复泄漏没什么大不了的!
但有人想知道进行分组的"算法"吗?
开发在Windows XP下进行.
(我希望有人理解,我试图解释......)
EDIt:我说的是循环引用造成的泄漏.
使用智能指针多少钱,特别是boost :: shared_ptr在时间和内存方面与裸指针相比成本更高?对于游戏/嵌入式系统的性能密集型部分,是否更好地使用裸指针?您是否建议使用裸指针或智能指针来处理性能密集型组件?
就像它已经写在这里 Qt到目前为止有8个特定的智能指针类.它看起来就像你需要的一切.但是,为了使用这些智能指针中的任何一个,您的类必须从QObject派生,这并不总是方便的.在Qt中是否有其他智能指针实现可以与任意类一起使用?
任何人都可以解释一下,CComPtr在CC中使用CComQIPtr有什么用?
CComPtr<ISampleInterface> Sample1;
CComQIPtr<ISampleInterface> Sample2;
Run Code Online (Sandbox Code Playgroud) 让我说我有这个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 ++ - 想法,并且对这个问题有点困惑.
我想要一个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) 例如 -
#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)足够了?
将对象传递给函数时,相同的规则是否适用于智能指针以及包含动态内存的其他对象?
例如,当我传递std::vector<std::string>给函数时,我总是考虑以下选项:
我将改变矢量对象的状态,但我不希望在函数完成后反映这些更改,AKA进行复制.
void function(std::vector<std::string> vec);
Run Code Online (Sandbox Code Playgroud)我要改变矢量对象的状态,我确实希望在函数完成后反映这些更改,AKA做出参考.
void function(std::vector<std::string> & vec);
Run Code Online (Sandbox Code Playgroud)这个对象非常大,所以我最好传递一个引用,但是告诉编译器不要让我改变它.
void function(std::vector<std::string> const& vec);
Run Code Online (Sandbox Code Playgroud)现在这与智能指针的逻辑相同吗?什么时候应该考虑移动语义?关于如何通过智能指针的一些指导是我最想要的.
smart-pointers ×10
c++ ×9
c++11 ×4
pointers ×2
atl ×1
auto-ptr ×1
boost ×1
c++14 ×1
com ×1
constructor ×1
memory ×1
memory-leaks ×1
pool ×1
qt ×1
std ×1
unique-ptr ×1
visual-c++ ×1