相关疑难解决方法(0)

为什么这个向量迭代器不可递增?

我正在尝试删除向量的内容而我收到错误 - 向量迭代器不可递增,为什么会这样?

这是我的析构函数:

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)

谢谢.

c++ iterator memory-management vector

19
推荐指数
2
解决办法
3万
查看次数

可能STL迭代器方法抛出异常

析构函数可能不会抛出异常(因此在异常处理期间可以完成堆栈展开),并且必须释放分配给该对象的任何资源(因此不会泄漏资源).包含多个其他对象(或分配了多个资源)的对象的设计可能会在STL容器中记录指向它们的指针.因此析构函数将使用以下与迭代器相关的方法:

  • begin(),end()对于容器
  • operator++ 对于有效的迭代器
  • operator*或者operator->对于有效的迭代器

但是为了保证析构函数不会抛出异常并释放其资源,您需要依赖那些永远不会抛出异常的方法.

依赖那些从不抛出异常的方法是否安全?很难想象一个实际的实现会抛出异常,因为STL迭代器本质上是一个指针.但标准C++是否要求这些方法永远不会抛出异常?我没有在C++标准中找到明确的陈述.


编辑:有趣的情况是C++ 03,当你想拥有一个指向资源的容器.这样做有充分的理由; 例如,如果您有多态资源.正如BjörnPollex在他的回答中指出的那样,如果你使用一个资源容器(比如a std::list< Resource >)而不是一个指向资源的指针的容器,容器的析构函数将为你处理对象的破坏(释放)Resource.

c++ stl exception

18
推荐指数
2
解决办法
5397
查看次数

C++向量中向量的动态分配?

我现在正在工作,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++中不起作用.

所以我的问题是,我应该如何应对这种情况才能使其发挥作用?或者我只是想错了,它应该以另一种方式完成?

谢谢你的回答.

c++ stl

3
推荐指数
1
解决办法
3434
查看次数

如果使用remove_if和items是指向对象的指针,如何删除向量中的项?

我担心通过执行以下操作会遇到内存泄漏问题:

(示例代码)

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库.

谢谢!

c++ memory-leaks vector erase remove-if

1
推荐指数
1
解决办法
3830
查看次数

指针模板清除功能的向量无法使用"未定义的引用"消息进行编译

对于我的程序,我做了一个小函数来清除我所拥有的各种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

c++ templates stl stdvector

0
推荐指数
1
解决办法
1710
查看次数

自动删除集合的实例,如std:list或std :: vector?

例如,我有一组指针std::vector<std::string*>.

删除集合时,哪种方法是自动删除项目指向的实例?

当我删除集合时,我会自动删除所有指向的项目.

c++ c++11

-1
推荐指数
1
解决办法
126
查看次数