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() 时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

将结构插入地图时出现分段错误

删除时出现分段错误

分配时出现分段错误[重复]

在 C++ 中使用向量时出现分段错误

分段错误:在 C++ 中弹出向量时出现 11

返回指针时出现分段错误[重复]