vector::size 和分段错误
Posted
技术标签:
【中文标题】vector::size 和分段错误【英文标题】:vector::size and Segmentation fault 【发布时间】:2011-05-26 09:32:15 【问题描述】:为什么这段代码会抛出分段错误?:/
listeners = new vector<Listener*> ();
... /* other code */
if (listeners != NULL)
int i = listeners->size();
【问题讨论】:
嗯,三个点的内容至关重要。您的代码示例不会以任何方式重现问题,那么我们怎么可能确定问题所在? @Mart:您必须粘贴代码。我猜这个向量在某个时候被删除了,因此你正在取消引用一个无效的指针。 我觉得这 3 个点在这里很重要。 指针可以为非NULL,但仍然无效。 为了补充这一点,我会写一些类似 listeners = shared_ptr仅仅因为指针不是NULL
并不意味着它指向一个有效的vector<Listener*>
对象。
通过 valgrind 运行您的程序以检测内存损坏问题,并确保您也通过调试器运行您的代码。
如果您仍然有问题,请发布一个重现问题的测试(而不是没有问题的小 sn-ps 代码)。
【讨论】:
Valgrind 帮助...问题在于从内存中删除对象...但仍在尝试使用另一个不知道删除的指针来处理它【参考方案2】:比使用 valgrind 更容易的是在分配后立即移动 listeners->size()
调用,然后查看它是否会出现段错误。如果不是,请将其移动几行代码,然后重试,重复。如果它出现段错误,您只是找到了导致它的行。也许你已经用指针做了一些事情,这是一种找到那段代码的方法。
看看bisection method。
可能并不总是有效,它更像是一种启发式方法。
【讨论】:
导致分段错误的行是:int i = listeners->size(); 是的,但尝试将导致段错误的行向上移动。假设点中有一些代码导致 listeners->size() 出现段错误,也许你用指针做了一些丑陋的事情。 @Mart - 这意味着listeners
在那里无效。将该行向上移动到...
部分,直到它不再无效。然后你就更接近真正的问题所在了,并且可以查看中间代码。
正如您所指出的,这不是一种可靠的方法。 UB 可能会也可能不会导致分段错误。【参考方案3】:
vector<Listener*> listeners;
可能会为您节省一些问题或使代码中断的原因更加明显
【讨论】:
以上是关于vector::size 和分段错误的主要内容,如果未能解决你的问题,请参考以下文章