我有一个基类,它由多个派生类继承.我想创建baseClass指针的autopointer数组.当我初始化那些autopointer我得到一些编译时错误,然后我试图这样做
std::auto_ptr<base>pbase[3];
std::auto_ptr<base> b1(new derived1());
std::auto_ptr<base> b2(new derived2());
std::suto_ptr<base> b3(new derived3());
pbase[0] = b1;
pbase[1] = b2;
pbase[2] = b3;
Run Code Online (Sandbox Code Playgroud)
它工作正常,我修复了内存泄漏问题,而我一个窗口,我不使用valgrind,我使用boost框架泄漏.
编译错误:
class A{
public:
std::auto_ptr<base>pbase[2];
}
Run Code Online (Sandbox Code Playgroud)
在A.cpp文件中
A::A():pbase[0](new derived1()), pbase[1](new derived2()){
}
Run Code Online (Sandbox Code Playgroud)
我收到了错误 C2059:syntax error : '['
我不能在我的项目中使用shared_ptr,没有提升:(
所以,我的课程大致类似于下面的课程:
class MyClass
{
private:
std::auto_ptr<MyOtherClass> obj;
};
Run Code Online (Sandbox Code Playgroud)
现在,我想在std :: vector中存储上面类的实例.安全吗?我在这里读到 std :: auto_ptr与STL容器一起使用是错误的.这适用于我的情况吗?
我刚刚发现了auto_ptr的概念,我很喜欢它!由于Qt经常需要QList或QVector <(某些QObject或QWidget)*>,是否应该避免使用auto_ptr的具体原因.如果我是对的,它允许你替换它:
std::vector<MyClass*> vec;
/* add several elements to the vector and do stuff with them */
for(size_t i=0; i<vec.length(); ++i)
{
delete vec[i];
}
vec.clear();
Run Code Online (Sandbox Code Playgroud)
用更短的东西(即没有清理)
std::vector<auto_ptr<MyClass>> vec;
/* add several elements to the vector and do stuff with them */
// no need for the delete loop
Run Code Online (Sandbox Code Playgroud)
... Qt仍然可以使用auto_ptr进行共享内存魔术吗?父子自动记忆管理是否仍然透明地运作?谢谢
我有一个关于引用集合子集的快速问题.考虑我有一个对象矢量.现在我想创建另一个向量,它是此向量的子集,我不想创建对象子集的副本.
我正在考虑的方法之一是创建一个vector<auto_ptr<MyClass> >.这是一个好方法吗?如果您认为在这种情况下任何其他容器或习语或模式会有所帮助,请建议.谢谢
在某些类中,我有一个带有指针的静态std :: map.我的问题是,如果我需要在程序结束时删除或自动释放此内存.我关心的是当删除std :: map时,是否通过析构函数正确删除了存储在内部的指针.
谢谢.
我有一个类使用一些回调来进行计算.那些回调需要分配需要在回调范围之外生存的数据(动态数组),而不是在类破坏之后.我想过当一个类破坏时vector,auto_ptr它会自动被破坏:
class MyClass
{
vector<auto_ptr<MyObject>> ThingsToDie;
};
Run Code Online (Sandbox Code Playgroud)
问题是我分配了很多对象,并且它们不共享基类型,所以我不能使用vector它,并为每种类型制作一个向量是很多工作.
如下所示的层次结构:
auto_ptr_base (virtual destructor)
|
auto_ptr<T>
Run Code Online (Sandbox Code Playgroud)
将解决我的问题,因为我可以做类似的事情
class MyClass
{
vector<auto_ptr_base> ThingsToDie;
};
Run Code Online (Sandbox Code Playgroud)
并且将自动将销毁实际分派给每个专用类型.
问题是STL没有那个层次结构,我不想重新实现auto_ptr.
还有其他解决方案吗?
我有一个通用的链表,可以处理各种类型的数据,包括对象和指向对象的指针等,但是当我从一个派生自抽象类的类中插入对象时,我无法使用该列表.
我有一个名为vehicle的抽象类和2个carr和卡车类,我可以这样做:
list<vehicle> lv;
vehicle * v1;
vehicle * v2;
v1 = new carr;
v2 = new truck;
cin >> *v1 >> *v2;
//But when I try to insert in the list
lv.insertEnd(*v1);
Run Code Online (Sandbox Code Playgroud)
我有错误:
不能分配抽象类型'车辆'的对象
并且编译器显示错误是在我编写的部分中的链表代码的insertEnd方法中:
newNode->item = new Item;
Run Code Online (Sandbox Code Playgroud)
这是一个项目的一部分,我需要有一个车辆列表,车辆可以是卡车,卡车等.我有一组车辆实施指针指针,但我试图用一个车辆列表这样做.
你能帮助我吗?
编辑:该项目在我的链接列表中,我将显示我的insertEnd方法:
template <class Item>
void list<Item>::insertEnd(const Item& item)
{
node<Item> *newNode= new node<Item>;
newNode->item = new Item;
*(newNode->item) = item;
newNode->next = 0;
if(head == 0)
{
head = newNode;
tail = newNode;
_size++;
}
else …Run Code Online (Sandbox Code Playgroud)