Pourquoi ne mettre une chaîne de caractères dans une struct provoquer un plantage?
J'ai une structure qui contient, entre autres choses, un couple de chaînes.
struct item {
string item_name;
int item_property_1;
double item_property_2;
}
Plus tard, j'ai initialiser:
item item1;
item1.item_name = "Name of Item";
item1.item_property_1 = 5;
item1.item_property_2 = 10.0;
Si je commente la ligne de l'affectation de la chaîne, il fonctionne très bien. Avec l'affectation de chaîne, il se bloque. Je n'ai aucune idée pourquoi.
J'ai maintenant commenté le contenu de toute autre fonction que d'essayer de suivre ce que pourrait être la cause de l'suggéré la corruption, et il se bloque toujours. Je suis pour une struct avec quelques chaînes et des nombres, et si j'attribue une valeur à l'une des chaînes qu'il se bloque.
Quelle est la cause de la corruption?
modifier l'Ajout, à la demande, de la plus petite quantité de code qui provoque un plantage. Commenté sections sont omis.
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;
}
C'est tout ce qui reste. J'ai seulement compris l'int de tester et de vérifier que l'attribution d'une valeur a bien fonctionné, et aussi longtemps que la chaîne est commenté qu'il fait. Toute utilisation de chaînes dans la structure provoque un blocage.
Je n'ai pas BESOIN d'eux. Je ne suis pas actuellement à l'aide de ces chaînes, je les ai mis dans la struct parce que j'ai l'intention de les utiliser plus tard, mais je peux accomplir le même but sans eux. Droit maintenant, je veux juste comprendre pourquoi.
le problème doit être ailleurs.
Probablement le crash est pas causés par cette ligne, quelque chose d'autre dans votre code écrit des ordures sur le item1 emplacement de mémoire.
Vous pouvez poster la plus petite quantité de code qui reproduit le crash?
J'ai un problème similaire, semble
string
est non initialisée gist.github.com/2639351OriginalL'auteur RuQu | 2012-03-16
Vous devez vous connecter pour publier un commentaire.
Que le code est parfaitement légal. L'erreur est dans une partie du reste de votre code.
OriginalL'auteur jalf
Le code fonctionne très bien: http://ideone.com/1NoMG
Il doit y avoir quelque chose de mal, d'ailleurs dans le code, ou de votre compilateur.
Aussi,
item1.item_name
est initialisé lorsque vous créezitem1
.item1.item_name = "Name of Item";
est une affectation.OriginalL'auteur Luchian Grigore
Votre code est ok, mais vous pourriez avoir de corruption de la mémoire, d'ailleurs dans votre code.
Ça plante si vous ne laissez que
item item1;
? Cela va créer de la chaîne de membre et initialiser une chaîne vide. Cette alloue de la mémoire, je voudrais donc attendues pour l'événement de ce crash. Essayez de lui attribuer une autre (plus courte) littéral ou déplacer ce code autour (le meilleur au début demain()
). Essayez de changer l'ordre de les membres de la structure - mettre entier et double avant de la chaîne et de voir ce qui se passe.J'ai mis les chaînes de caractères au début de la structure et a ensuite essayé de nouveau à la fin. Les deux s'est écrasé. J'ai essayé de déplacer la cession à une autre fonction, mais dès que cela s'appelait le programme s'est écrasé.
Ce qui se passe si vous essayez d'attribuer une (certaine) indépendant de la chaîne de l'objet (sans l'aide struct)? Pouvez-vous utiliser le débogueur et voir ce qui se passe dans
std::string
?Je n'ai pas de débogueur, mais déclarant chaîne test_str et de définir ensuite test_str = "test"; fonctionne bien, à la fois lorsqu'il est déclaré localement et ensuite essayé de nouveau comme une variable globale comme la structure est.
OriginalL'auteur Bojan Komazec
La suivante compile et s'exécute comme prévu avec G++ version 4.6.1 sans aucun plantage. Vous devez avoir autre chose incorrecte.
OriginalL'auteur gsbabil
Avez-vous, par hasard, une variable globale de type Ombre? Peut-être que l'ombre de la variable globale n'est pas initialisé lors d'un autre global est construit.
OriginalL'auteur Marius