push_back() 时出现分段错误
Posted
技术标签:
【中文标题】push_back() 时出现分段错误【英文标题】:segmentation fault while push_back() 【发布时间】:2014-11-30 16:27:55 【问题描述】:在 push_back() 函数中运行我的代码时出现分段错误, 我的程序如下..
程序:
#include<iostream>
#include <vector>
using namespace std;
class Point
private:
int x, y;
int * p;
public:
Point(int x1, int y1)
x = x1; y = y1;
*p = 1;
Point(const Point & p2)
x = p2.x;
y = p2.y;
*p = 1;
;
int main()
Point p1(10, 15);
Point p2 = p1;
vector<Point> vec;
for (int i=0; i<10; i++)
vec.push_back(p2);
有人可以给出上述程序中分段错误的原因吗???? 有人能给出上述程序中分段错误的原因吗???
【问题讨论】:
p
是一个指针,但在取消引用它之前,你没有让它指向一个有效的对象。
你能解释一下变量p的用途吗?如果你删除它,崩溃就会消失。你永远不会给 p 一个地址,所以你把 1 写到一个随机的内存位置
只是想在复制构造函数中增加该变量,以跟踪创建的副本数..
【参考方案1】:
Point(int x1, int y1)
x = x1; y = y1;
*p = 1; <<< allocate memory for this pointer first.
您正在取消引用未初始化的指针。
【讨论】:
但是如果我评论 push_back(),为什么它运行完美 这只是未定义的行为。如果您浏览该网站,您可以获得足够多的文章,这些文章可以完善您跑步的意义。现在你应该始终确保你没有取消引用未初始化的指针。 如果我给 p[0] = 1,会发生什么? 间接地说 *(p+0) = 1 即 *p = 1【参考方案2】:如果您想直接修改 x 和 y 的值,我建议将它们公开;这比让 getter 和 setter 来完成这项工作要好。同时,我建议修改你的代码:
int *p = new int;
这样做将为您的指针分配内存,然后您可以为其分配值。只是出于好奇,指针是干什么用的?
【讨论】:
@Chris,Vormeph,我正在学习 c++,我想数数。对象的副本,在复制构造函数中,我将增加该变量.. 如果你想这样做,你应该让 p 成为一个静态变量,让它在一个类中是全局的,不管实例化如何。每次调用构造函数时,您都会增加该变量,因此您应该使用 *p++,而不是 *p = 1。其余的取决于您。目前,变量将始终使用类本身进行实例化;因此它将始终为 1。以上是关于push_back() 时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章