【问题标题】:segmentation fault while push_back()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 写到一个随机的内存位置
  • 只是想在复制构造函数中增加该变量,以跟踪创建的副本数..

标签: c++ stl


【解决方案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。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 1970-01-01
  • 2020-08-22
  • 2020-11-15
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
相关资源
最近更新 更多