【发布时间】:2011-09-06 23:17:14
【问题描述】:
尝试调用“new”来创建指针并将其推入向量时出现段错误。我在向量中推送元素的代码是:
queue->push_back(new Box(gen_id, Interval(x_mid, x_end), Interval(y_mid-y_halfwidth, y_mid+y_halfwidth)));
基本上,Box 是一个类,构造函数只接受 3 个参数,generation_id 和 2 个Intervals。我在这个“推送”之前和之后打印出了向量中的内容,
之前:
[ -0.30908203125, -0.3087158203125 ] , [ -0.951416015625, -0.9510498046875 ]
[ -0.3087158203125, -0.308349609375 ] , [ -0.951416015625, -0.9510498046875 ]
[ -0.30908203125, -0.3087158203125 ] , [ -0.9510498046875, -0.95068359375 ]
[ -0.3087158203125, -0.308349609375 ] , [ -0.9510498046875, -0.95068359375 ]
之后:
[ -0.30908203125, -0.3087158203125 ] , [ -0.951416015625, -0.9510498046875 ]
[ -0.3087158203125, -0.308349609375 ] , [ -0.951416015625, -0.9510498046875 ]
[ 8.9039208750109844342e-243, 6.7903818933216500424e-173 ] , [ -0.9510498046875, -0.95068359375 ]
[ -0.3087158203125, -0.308349609375 ] , [ -0.9510498046875, -0.95068359375 ]
[ -0.3087158203125, -0.308349609375 ] , [ -0.95123291015625, -0.95086669921875 ]
我不知道为什么会发生这种情况,但显然,有一个元素已损坏。除了“push”之外,这两组输出之间没有其他代码,我使用gdb来确认。另外,我检查了这 2 个Intervals 变量,它们都给了我一个有意义的结果。
我的问题是:“新”在什么情况下会出现段错误?还是我的问题是由于其他原因引起的?谢谢。
【问题讨论】:
-
段错误什么时候发生?请告诉我们
Box的代码。 -
你为什么要推指针?
-
我不认为 new 通常可以分段。我会寻找堆栈损坏,从
Box(int, Interval, Interval)、Interval(int, int)和Intervals 复制/移动构造函数/操作符开始 -
@Moo,
new如果存在堆损坏,可能会出现段错误。 -
@Henning Makholm:如果存在堆损坏,任何事情都可能发生。 stackoverflow.com/questions/2766731/…,是的。仍然:可能是数组边界或指针错误。
标签: c++ segmentation-fault new-operator allocation