我正在尝试删除向量的内容而我收到错误 - 向量迭代器不可递增,为什么会这样?
这是我的析构函数:
City::~City()
{
vector <Base*>::iterator deleteIterator;
for (deleteIterator = m_basesVector.begin() ; deleteIterator != m_basesVector.end() ; deleteIterator++)
m_basesVector.erase(deleteIterator);
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
析构函数可能不会抛出异常(因此在异常处理期间可以完成堆栈展开),并且必须释放分配给该对象的任何资源(因此不会泄漏资源).包含多个其他对象(或分配了多个资源)的对象的设计可能会在STL容器中记录指向它们的指针.因此析构函数将使用以下与迭代器相关的方法:
begin(),end()对于容器operator++ 对于有效的迭代器operator*或者operator->对于有效的迭代器但是为了保证析构函数不会抛出异常并释放其资源,您需要依赖那些永远不会抛出异常的方法.
依赖那些从不抛出异常的方法是否安全?很难想象一个实际的实现会抛出异常,因为STL迭代器本质上是一个指针.但标准C++是否要求这些方法永远不会抛出异常?我没有在C++标准中找到明确的陈述.
编辑:有趣的情况是C++ 03,当你想拥有一个指向资源的容器.这样做有充分的理由; 例如,如果您有多态资源.正如BjörnPollex在他的回答中指出的那样,如果你使用一个资源容器(比如a std::list< Resource >)而不是一个指向资源的指针的容器,容器的析构函数将为你处理对象的破坏(释放)Resource.
我现在正在工作,vector我有一个有趣的情况,我需要帮助.
我有一个矢量矢量,定义如下:
vector< vector<int> > list;
Run Code Online (Sandbox Code Playgroud)
我正在使用标准输入加载数字cin >> helpVar;,每当我得到0(零)时我想创建新的整数向量,这将被放入这个"主容器" list.
当然我不知道零号会出现多少次 - 这是用户所依赖的.所以我也不知道,程序会添加多少向量.
但我不知道,究竟是怎么做到的.如果我使用C#或其他类似垃圾收集的语言,我可能会写:
if(helpVar == 0)
{
list.push_back(new vector<int>);
}
Run Code Online (Sandbox Code Playgroud)
但是这种结构在C++中不起作用.
所以我的问题是,我应该如何应对这种情况才能使其发挥作用?或者我只是想错了,它应该以另一种方式完成?
谢谢你的回答.
我担心通过执行以下操作会遇到内存泄漏问题:
(示例代码)
class myItem //random container stuff mostly. All primatives.
{
int index;
char* name;
int val1;
int val2;
};
class vecList
{
vector< myitem* > *myVec;
void delete()
{
MyVec->erase(std::remove_if(myVec->begin(), MyVec->end(), IsMarkedToDelete), MyVec->end()); //leak here?
}
};
Run Code Online (Sandbox Code Playgroud)
如果它是一个指针,擦除不释放内存,对吗?如果我没有使用remove_if,我可以在销毁之前调用指针上的delete.在这种情况下我该怎么做?智能指针?我不想用它们重新实现所有内容,我真的不想添加boost库.
谢谢!
对于我的程序,我做了一个小函数来清除我所拥有的各种std ::指针向量.
template <class S>
void clearPtrVector(std::vector<S*> &a,int size)
{
for(size_t i = 0; i < size; i++)
delete a[i];
a.clear();
}
Run Code Online (Sandbox Code Playgroud)
我必须在这里做错了,因为在析构函数中调用此函数是这样的:
clearPtrVector(neurons,neurons.size());
Run Code Online (Sandbox Code Playgroud)
我两次得到以下未定义的引用:
undefined reference to `void clearPtrVector<Neuron>(std::vector<Neuron*,std::allocator<Neuron*> >&, int)'
Run Code Online (Sandbox Code Playgroud)
我不得不承认我不熟悉std :: allocator是什么,所以我无法猜出这里可能出现的问题.任何帮助都非常感谢.提前致谢!
-Lefteris
例如,我有一组指针std::vector<std::string*>.
删除集合时,哪种方法是自动删除项目指向的实例?
当我删除集合时,我会自动删除所有指向的项目.