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>(new vector()) 的东西,而不是:p. 【参考方案1】:

仅仅因为指针不是NULL 并不意味着它指向一个有效的vector&lt;Listener*&gt; 对象。

通过 valgrind 运行您的程序以检测内存损坏问题,并确保您也通过调试器运行您的代码。

如果您仍然有问题,请发布一个重现问题的测试(而不是没有问题的小 sn-ps 代码)。

【讨论】:

Valgrind 帮助...问题在于从内存中删除对象...但仍在尝试使用另一个不知道删除的指针来处理它【参考方案2】:

比使用 valgrind 更容易的是在分配后立即移动 listeners-&gt;size() 调用,然后查看它是否会出现段错误。如果不是,请将其移动几行代码,然后重试,重复。如果它出现段错误,您只是找到了导致它的行。也许你已经用指针做了一些事情,这是一种找到那段代码的方法。 看看bisection method。

可能并不总是有效,它更像是一种启发式方法。

【讨论】:

导致分段错误的行是:int i = listeners->size(); 是的,但尝试将导致段错误的行向上移动。假设点中有一些代码导致 listeners->size() 出现段错误,也许你用指针做了一些丑陋的事情。 @Mart - 这意味着listeners 在那里无效。将该行向上移动到... 部分,直到它不再无效。然后你就更接近真正的问题所在了,并且可以查看中间代码。 正如您所指出的,这不是一种可靠的方法。 UB 可能会也可能不会导致分段错误。【参考方案3】:

vector&lt;Listener*&gt; listeners; 可能会为您节省一些问题或使代码中断的原因更加明显

【讨论】:

以上是关于vector::size 和分段错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥这段代码在 leetcode 运行良好,但在 geeksforgeeks 出现分段错误?

C++:当我添加看似无关的代码行时,分段错误消失了

什么是分段错误?

总线错误与分段错误

分段错误:为啥?

线程示例,分段错误