【问题标题】:Why does putting a string in a struct cause a crash? [closed]为什么将字符串放入结构中会导致崩溃? [关闭]
【发布时间】:2012-04-01 20:56:45
【问题描述】:

我有一个结构,其中包含几个字符串。

struct item {
    string item_name;
    int item_property_1;
    double item_property_2;
}

稍后我初始化它们:

item item1;
item1.item_name = "Name of Item";
item1.item_property_1 = 5;
item1.item_property_2 = 10.0;

如果我注释掉分配字符串的行,它运行良好。使用字符串分配,它会崩溃。我不知道为什么。

我现在已经注释掉了所有其他函数的内容,试图追踪可能导致建议的损坏的原因,但它仍然崩溃。我只剩下一个带有几个字符串和数字的结构,如果我为任何字符串赋值,它就会崩溃。

什么可能导致这种损坏?

edit 按请求添加导致崩溃的最少量实际代码。注释掉的部分被省略。

struct player_c {
        string advClass;
        int role;
};

player_c shadow;

Shadow::Shadow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Shadow)
{
    ui->setupUi(this);
    shadow.advClass = " ";
    shadow.role = 1;
}

仅此而已。我只包含 int 来测试和验证为其分配值是否正常工作,只要将字符串注释掉就可以了。在结构中使用任何字符串都会导致崩溃。

我不需要它们。我目前没有使用这些字符串,我将它们放在结构中,因为我打算稍后使用它们,但没有它们我可以完成相同的目的。现在我只想明白为什么。

【问题讨论】:

  • 您没有编译时错误并且程序在运行时崩溃?
  • 问题肯定出在其他地方。
  • 可能崩溃不是由该行引起的,您的代码中的其他内容在 item1 内存位置写入了垃圾。
  • 你能发布最小量的代码来重现崩溃吗?
  • 我也有类似的问题,好像string未初始化gist.github.com/2639351

标签: c++ string struct


【解决方案1】:

该代码完全合法。错误出现在您的其他代码中。

【讨论】:

    【解决方案2】:

    代码运行良好:http://ideone.com/1NoMG

    代码的其他地方一定有问题,或者你的编译器。

    此外,item1.item_name 在您创建 item1 时被初始化。 item1.item_name = "Name of Item"; 是一个作业。

    【讨论】:

      【解决方案3】:

      您的代码看起来不错,但您的代码中的其他地方可能存在内存损坏。

      【讨论】:

      • 什么会导致内存损坏?除了结构声明和设置字符串值的一行之外,我现在已经将其他所有内容都注释掉了,并且每次都会崩溃。如果我分配其中一个数字,它工作正常。唯一的问题是字符串。
      • 只留下item item1;会不会崩溃?这将创建字符串成员并将其初始化为空字符串。这会分配内存,所以我预计事件会崩溃。尝试用其他一些(较短的)文字分配它或移动此代码(最好在main() 的开头)。尝试更改结构成员的顺序 - 将整数和双精度放在字符串之前,看看会发生什么。
      • 我将字符串放在结构的开头,然后在最后再次尝试。两人都坠毁了。我尝试将分配移动到另一个函数,但是一旦调用它,程序就崩溃了。
      • 如果你尝试分配(一些)独立的字符串对象(不使用结构)会发生什么?你能用调试器看看std::string发生了什么吗?
      • 我没有调试器,但是声明字符串 test_str 然后设置 test_str = "test";工作得很好,无论是在本地声明,然后像结构一样作为全局变量再次尝试。
      【解决方案4】:

      以下代码在 G++ 4.6.1 版本中按预期编译和运行,没有任何崩溃。你一定有其他不正确的地方。

      [21:18:32] user@host:[~]$ cat t.cpp
      
      #include <iostream>
      #include <string>
      
      using namespace std;
      
      struct item {
              string name;
              int number;
      };
      
      int main()
      {
              item i;
              i.name = "blah";
              i.number = 12;
      
              cout << "name=" << i.name << " number=" << i.number;
      }
      
      
      [21:18:34] user@host:[~]$ ./a.out 
      name=blah number=12
      
      [21:18:36] user@host:[~]$ 
      

      【讨论】:

        【解决方案5】:

        您是否有任何类型为 Shadow 的全局变量?构造另一个全局变量时,可能没有初始化影子全局变量。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-31
          • 1970-01-01
          • 2023-04-06
          • 2021-04-14
          • 2021-06-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多