【问题标题】:What is causing this Segmentation Fault: 11?是什么导致此分段错误:11?
【发布时间】:2014-09-25 06:08:46
【问题描述】:

好的,这实际上是我编写的第一个 C++。因此,我尝试研究此分段错误错误未能产生我能理解的有用响应。大多数建议说我超出了堆内存,但我看不出我在这段代码中的表现如何。也许我想引用一些我无法引用的东西?

有人可以看看这段代码并告诉我是什么导致了这个错误吗?代码编译得很好,它只是在运行时抛出这个错误。我试过注释掉所有涉及向量的代码,但这并没有解决问题。我猜这是我错过的一些愚蠢的东西,或者只是我不理解的关于 C++ 的概念。无论哪种方式,一些见解将不胜感激!提前致谢。

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;

const int DEFAULT_SIZE = 15;



//---------------------------------User----------------------------------------------------------------------------------
//User Interface Definition
class User 
{
public:
    User(string nameValue);
    string getName();
    string getWall();
    string getHome();
private:
    string name;
};
//User Implementation Definition
User::User(string nameValue) : name(nameValue)
{
}
string User::getName() 
{
    return name;
}

//---------------------------------Group----------------------------------------------------------------------------------
//Group Interface Definition
class Group 
{
public:
    Group(string nameValue);
    string getName();
    void addMember(User newMember);
private:
    string name;
    vector<User> members;
};
//Group Implementation
Group::Group(string nameValue) : name(nameValue)
{
}
string Group::getName()
{
    return name;
}
void Group::addMember(User newMember)
{
    members.push_back(newMember);
}

//---------------------------------MessageBuffer----------------------------------------------------------------------------------
//MessgeBuffer Interface Declaration
class MessageBuffer 
{
public:
    MessageBuffer();
    void insert(string user, string recipient, string message);
    string readByGroup(string groupName);
    string readByUser(string userName);
    string readPublic();
private:
    string buffer;
};
//MessageBuffer Implementation
MessageBuffer::MessageBuffer() : buffer("")
{
}
void MessageBuffer::insert(string user, string recipient, string message) 
{
    buffer = "|<" + user + "::" + recipient + ">|" + message + buffer;
}
string MessageBuffer::readByGroup(string groupName) 
{
    return "Something";
}
string MessageBuffer::readByUser(string userName)
{
    return "Something";
}
string MessageBuffer::readPublic()
{
    return "Something";
}

//---------------------------------System-------------------------------------------------------------------------------
//System Interface Definition
class System 
{
public:
    System();
    void start();
private:
    bool running;
    User currentUser;
    MessageBuffer messageBuffer;
    vector<User> users;
    vector<Group> groups;
};
//System Implementation Definition
System::System() : running(false), currentUser(0)
{
}

void System::start() 
{
    running = true;
    string userSelection;

    cout << "===========================================================" << endl;
    cout << "|\t  Welcome to the Auburn Messaging System! \t  |" << endl;
    cout << "===========================================================" << endl;
    while (running) {
        cout << "1) Create a new user\n";
        cout << "2) Broadcast a message\n";
        cout << "3) Multicast a message\n";
        cout << "4) Unicast a message\n";
        cout << "5) Display Wall page\n";
        cout << "6) Display Home page\n";
        cout << "7) Create a new group\n";
        cout << "8) Join a group\n";
        cout << "9) Switch to a different user\n";
        cout << "10) Quit Auburn Messaging System\n";
        cin >> userSelection;
        if (userSelection == "1")
        {
            running = false;
        }
    }
}
//----------------------------------------------------------------------------------------------------------------------
int main() {
    cout << "Part 1";
    System system1;
    cout << "Part 2";
    system1.start();
    cout << "Part 3";
    return 0;
}

【问题讨论】:

  • 你试过调试了吗?
  • 这可能应该是我的第一步,但老实说,我刚刚在 Sublime 中编写并在终端中编译。可能应该弄清楚如何为此使用 xCode。
  • 或者学习使用GDB。
  • 我想你可以通过注释掉system1的声明很容易找到问题所在。这个程序很简单,调试它可能是一个非常小的消除过程。这是假设崩溃发生在currentUser构造期间——而不是稍后的某个时间。
  • @nobar 从这个意义上说,我确实调试了它。我尝试注释掉 system1 的声明等,但它仍然抛出错误。

标签: c++ segmentation-fault


【解决方案1】:

System 构造函数中,currentUser(0) 正在尝试使用将被解释为空字符指针的文字零初始化User 构造函数(string)的第一个参数。

从 char* 构造字符串的 std::string 构造函数(在调试器中查找 basic_string&lt;char&gt;)将使用空指针调用,它将取消引用并调用未定义的行为。

【讨论】:

  • 这就是问题所在。我认为 0 可以用作在 Java 中等同于 null 的 C++。
  • 既然您知道错误在哪里(以及它是什么),请使用调试器来观察程序在失败时的状态。
  • @ordanj 你有点倒退了,在 C 和 C++ 中,NULL 是 0 的宏,而在 Java 中它是唯一值。 C++11 增加了一个nullptr_t,它更像是Java null 值但仍然会导致段错误。
  • @ordanj 从 C++11 开始,只要你指的是空指针,你就应该使用 nullptr
  • 如果要将 std::string 初始化为空字符串,请使用空字符串:""。您不希望它为空。只有指针可以为空。 (Mythagel,你的回答应该更清楚地解释接受 char 指针的 std::string 构造函数是被调用的构造函数,并且它会立即继续尝试取消引用空指针。)
猜你喜欢
  • 2012-08-14
  • 1970-01-01
  • 2011-01-10
  • 2020-09-15
  • 2012-04-19
  • 1970-01-01
相关资源
最近更新 更多