【问题标题】:vector::size and Segmentation faultvector::size 和分段错误
【发布时间】: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.

标签: c++ vector size segmentation-fault


【解决方案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; 可能会为您节省一些问题或使代码中断的原因更加明显

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-14
    • 2017-03-26
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多