C++ 向量:大小和分割错误

C++ 向量:大小和分割错误,c++,vector,size,segmentation-fault,C++,Vector,Size,Segmentation Fault,为什么此代码会引发分段错误?:/ listeners = new vector<Listener*> (); ... /* other code */ if (listeners != NULL) { int i = listeners->size(); } listeners=newvector(); ... /* 其他代码*/ if(侦听器!=NULL){ int i=侦听器->大小(); } 指针不是NULL并不意味着它指向一个有效的向量对象 通过valgrind运

为什么此代码会引发分段错误?:/

listeners = new vector<Listener*> ();

... /* other code */

if (listeners != NULL) {
int i = listeners->size();
}
listeners=newvector();
... /* 其他代码*/
if(侦听器!=NULL){
int i=侦听器->大小();
}

指针不是
NULL
并不意味着它指向一个有效的
向量
对象

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


如果仍然存在问题,请发布一个重现问题的测试(而不是不存在问题的小代码片段)。

比使用valgrind更简单的方法是在分配后立即移动
侦听器->size()
调用,并查看它是否出现故障。如果没有,请将代码移低几行,然后重试,重复。如果它出现故障,您只需找到导致故障的线路。也许您已经用指针做了一些事情,这是一个查找代码片段的方法。 看这张照片


可能并不总是有效的,这更像是一种启发可能会为您省去一些问题,或者使代码中断的原因更加明显

好吧,这三点的内容非常重要。您的代码示例不会以任何方式重现问题,因此我们怎么可能确定问题?@Mart:您必须粘贴代码。我猜向量在某个点被删除了,因此您取消了对无效指针的引用。我感觉这3个点在这里很重要。指针可以是非空的,但仍然是无效的。为了补充这一点,我将编写类似listeners=shared_ptr(new vector())的内容,相反:导致分段错误的p.line是:int i=listeners->size();是的,但试着将导致SEG故障的线路向上移动。假设点中有一些代码导致侦听器->size()出错,可能是您对指针做了一些不好的操作。@Mart-这意味着
侦听器在那里无效。将该行向上移动到
部分,直到不再无效。然后,您已经更接近真正的问题所在,并且可以查看干预代码。正如您所指出的,这不是一种可靠的方法。UB可能会也可能不会导致分段错误。Valgrind有助于。。。从内存中删除对象时出现问题。。。。但是仍然尝试用另一个不知道delete的指针来处理它