我正在参加GIS编程的C ++编程课程。我真的开始从处理适当的内存管理中获得很多麻烦。考虑到任何时候通常有8-10个类,每个类都有一个指向3D矩阵的指针或其他非常大的指针。现在我们的课程已经提出了教授的问题,允许我们使用Boost,或至少使用2008年的C ++ Feature Pack(针对TR1)。他拒绝但是说如果我们想要我们可以找到添加一些第三方cpp / hpp文件。我已经尝试过将shared_ptr从提升中解脱出来,但这比其价值更令人头疼。
那里有任何类型的免费shared_ptr实现吗?
答案 0 :(得分:17)
答案 1 :(得分:4)
给Lokis重新计算的智能指针一个镜头 - 据我所知,它更少耦合,然后提升标题。
答案 2 :(得分:3)
包含shared_ptr
定义的预处理提升标头。将其写入单个.hpp文件。通过这种方式,您可以在一个头文件中获得boost shared_ptr
及其所有依赖项,而无需完全安装boost。
shared_ptr
不需要任何共享库链接到您的代码,它是一个仅限标题的库...所以这应该有用。
答案 3 :(得分:1)
虽然对于生产解决方案来说这是一个可怕的想法,但是如果你没有尝试成为交叉编译器,那么为一个类推出自己的想法就不会太难了和线程安全的提升:
template <typename contained>
class my_shared_ptr {
public:
my_shared_ptr() : ptr_(NULL), ref_count_(NULL) { }
my_shared_ptr(contained * p)
: ptr_(p), ref_count_(p ? new int : NULL)
{ inc_ref(); }
my_shared_ptr(const my_shared_ptr& rhs)
: ptr_(rhs.p), ref_count_(rhs.ref_count_)
{ inc_ref(); }
~my_shared_ptr() {
if(ref_count_ && 0 == dec_ref()) { delete ptr_; delete ref_count_; }
}
contained * get() { return ptr_; }
const contained * get() const { return ptr_; }
void swap(my_shared_ptr& rhs) // throw()
{
std::swap(p, rhs.p);
std::swap(ref_count_, rhs.ref_count_);
}
my_shared_ptr& operator=(const my_shared_ptr& rhs) {
my_shared_ptr tmp(rhs);
this->swap(tmp);
return *this;
}
// operator->, operator*, operator void*, use_count
private:
void inc_ref() {
if(ref_count_) { ++(*ref_count_); }
}
int dec_ref() {
return --(*ref_count_);
}
contained * ptr_;
int * ref_count_;
};
答案 4 :(得分:1)
#include <tr1/memory> // this is contained in STL.
std::tr1::shared_ptr<A> a = new A;
ow,刚刚看到你的教授不允许你使用TR1。艰难的运气。
答案 5 :(得分:1)
你真的需要共享所有权吗?
你可以经常使用一个简单的ad hoc RAII类来获取对象的独占所有权。
没有RAII的内存管理很痛苦,但你得到的RAII没有shared_ptr
。
答案 6 :(得分:1)
我刚发现你的代码示例中存在严重错误。 它应该是
ref_count_(p ? new int(0) : NULL)
而不是
ref_count_(p ? new int : NULL)
计数器应初始化为0。 如果不是你所有的智能指针都不再聪明。 所有那些做错误的程序员在以后的调试中付出了很多代价, 你应该像编译器一样思考,并采取行动......