J'ai ce code C++:
#include <iostream>
using namespace std;
struct MyItem
{
int value;
MyItem* nextItem;
};
int main() {
MyItem item = new MyItem;
return 0;
}
Et je reçois l'erreur:
error: conversion from `MyItem*' to non-scalar type `MyItem' requested
Compilation avec g ++. Qu'est-ce que ça veut dire? Et que se passe-t-il ici?
Essayer:
MyItem * item = new MyItem;
Mais n'oubliez pas de le supprimer après utilisation:
delete item;
Vous avez mélangé
MyItem item;
qui alloue une instance de MyItem
sur la pile. La mémoire de l'instance est automatiquement libérée à la fin de la portée englobante
et
MyItem * item = new MyItem;
qui alloue une instance de MyItem
sur le tas. Vous feriez référence à cette instance à l'aide d'un pointeur et seriez tenu de libérer explicitement la mémoire lorsque vous avez terminé d'utiliser delete item
.
Tout d'abord, ce code ne sera pas compilé car vous avez oublié les points-virgules après chaque déclaration de variable membre et après la déclaration MyItem
et le mot clé "struct" est mal tapé. Votre code devrait ressembler à ceci:
struct MyItem
{
var value;
MyItem* nextItem;
};
MyItem item = new MyItem;
Répondant maintenant à votre question, ce code ne fonctionne pas car le nouvel opérateur renvoie un pointeur sur l'objet créé (une valeur de type MyItem*
) et vous essayez d'affecter ce pointeur à une variable de type MyItem
. Le compilateur ne vous permet pas de le faire (car la valeur et la variable ont des types différents). Vous devez stocker le pointeur dans une variable appropriée, comme ceci:
MyItem* item = new MyItem;
Dans ce cas, vous devez vous rappeler de delete item
pour éviter les fuites de mémoire une fois que vous n'en avez plus besoin.
Vous pouvez également créer l'objet dans la pile sans l'opérateur new
.
MyItem item;
Dans ce cas, l'objet cesse d'exister lorsque la fonction revient; vous n'avez pas besoin de vous souvenir de le supprimer.
Voici le code édité avec les changements mentionnés à droite
struct MyItem // corrected spelling struct
{
var value; // added ;
struct MyItem * nextItem; // add "struct" and added ;
}; // added ;
MyItem * item = new MyItem; // added * before item
delete item; // not exactly here, but some where in your code
BTW, vous n'avez pas devez faire new
. Vous pouvez éventuellement créer un objet MyItem
sur la pile comme
MyItem anotherItem;