为什么类对象作为指针会产生分段错误,而通常的类对象则不会

时间:2015-06-23 15:09:22

标签: c++ class pointers c++11 private

我不明白为什么下面的代码在使用指针对象时会产生分段错误。如果使用非指针对象,代码工作正常,但如果使用指针对象更新私有向量成员'name',则会产生分段错误。 我得到指针的唯一方法是为向量成员'name'创建一个getter函数,并将其用作read_names()函数的参数。

CPP专家可以解释为什么会发生这种情况吗?

这是cpp文件。

#include "iostream"
#include "string"
#include "vector"

using namespace std;
#include "name_pairs.h"


int main()
{
    // The 2 lines below here is what works.
    // Name_pairs pair1;
    // pair1.read_names();

    //This part below gives segmentation fault.
    Name_pairs* pair1; 
    pair1->read_names();
    delete pair1;
    return 0;
}

这是头文件。

class Name_pairs
{
public:
    void read_names();
    // prompts the user for an age for each name. 

    void print();

private:

    vector<string> name;
    vector<double> age;

};

void Name_pairs::read_names()
{
    // string in;
    for (string in; cin>>in;)
    {
        name.push_back(in); //segmentation fault occurs here! 

    }
}

3 个答案:

答案 0 :(得分:1)

你声明一个指针,然后永远不会初始化它

Name_pairs* pair1; 
pair1->read_names();

实际上,这甚至不需要是指针

Name_pairs pair1{};
pair1.read_names();

答案 1 :(得分:1)

以下代码

Name_pairs* pair1;

仅声明指针。 紧接着的代码:

pair1->read_names();

取消引用指针。但由于指针尚未初始化为指向任何分配的内存,程序崩溃。

确保指针实际初始化为已分配的实例:

Name_pairs* pair1 = new Name_pairs();

答案 2 :(得分:0)

生成有关Name_pairs的对象是必要的。

Name_pairs* pair1;

- &GT;     Name_pairs * pair1 = new Name_pairs();