C++11将传统指针转换为智能指针.使用来自llvm的最新SVN-Clang和libc++
C++11 Convert traditional pointer to smart pointer. Using up-to-date SVN Clang and libc++ from llvm
我在一个类(a)中有一个函数,它基本上将指向另一个类的指针作为参数。B类由它也应该接受的多个其他类继承。
我想做的是将这个指针的所有权存储起来,以便以后在类中使用,它不会再在类外用于其他任何事情。虽然我会将参数设为shared_ptr,但我希望尽可能避免这种情况,因为与我共事的其他人并不完全了解智能指针的功能。有办法做到这一点吗?
这是我想做的一个例子,尽管从我测试的情况来看,这不起作用。
//In .h file
std::vector< unique_ptr< B > > data_store;
//In .cpp file
void A::add_data(B* NewItem)
{
data_store.resize(data_store.size()+1);
data_store[data_store.size()-1] = NewItem;
}
其次,我可能想在类中使用一个复制构造函数或类似的东西来使用智能指针:由于我必须要做的事情,如果我必须手动删除,它可能会变得有点难看。问题是,我不知道它是基类(B),还是从B继承的类。我不太确定如何处理它,而不必为该类硬编码某种可检查的ID,并使用正确的复制/移动构造函数,我希望不惜一切代价避免这种情况。
我使用的是llvm更新的Clang和libC++,我在英国时间2012年3月12日上午10点左右更新了它。
对于任何不应该共享的指针,类拥有std::unique_ptr<T>
的唯一所有权是正确的选择。当所属对象超出范围/被删除时,它将自动删除指针。实际上,我建议不要使用共享指针,因为它会向其他开发人员传达该成员应该是共享的。
复制也是如此。由于您有一个指向可能具有子类的对象的指针,因此需要使用clone
习惯用法,而不是普通的复制构造函数。它通常通过具有虚拟clone
函数来实现,该函数向类返回指针(或智能指针)。这需要所有子类重新实现这一点,并返回其自身的副本。
class Base {
...
virtual std::unique_ptr<Base> clone() const = 0;
...
};
class Subclass {
...
virtual std::unique_ptr<Base> clone() const {
return std::unique_ptr<Base>(new Subclass(*this));
}
};
如果拥有对象具有复制构造函数,则在创建自身副本时,必须对其拥有的对象调用此克隆成员函数。
如果您希望创建一个对象,它拥有指针的向量,您应该使用boost::vector_ptr。它自动删除自身中包含的所有对象
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- LLvm Jit:如何从抖动代码中取消引用运行时指针?
- llvm 如何知道成员函数指针是否指向虚函数?
- LLVM - 从具有偏移量的指针加载变量
- 将无效指针传递给LLVM Irbuilder createCall
- Llvm C++ API 将指向函数的指针传递给另一个函数
- Clang LLVM为JIT编译功能提供了不良功能指针
- 检查 LLVM 中的指针到指针类型
- LLVM-IR 数组指针分配
- 有什么方法可以获取llvm顺从指针值的原始类型(即指针类型)
- C++11将传统指针转换为智能指针.使用来自llvm的最新SVN-Clang和libc++
- LLVM中的非指针全局变量
- LLVM:创建一个带有空指针操作数的CallInst
- 如何检查LLVM StoreInst的目标是否是函数指针
- 在LLVM中创建字面指针值
- 与 LLVM JIT 代码共享C++指针
- 在LLVM IR中一切都是指针吗?