私はこのC++コードを持っています:
#include <iostream>
using namespace std;
struct MyItem
{
int value;
MyItem* nextItem;
};
int main() {
MyItem item = new MyItem;
return 0;
}
そして、私はエラーを取得します:
error: conversion from `MyItem*' to non-scalar type `MyItem' requested
G ++でコンパイルします。どういう意味ですか?そして、ここで何が起こっていますか?
試してください:
MyItem * item = new MyItem;
ただし、使用後に削除することを忘れないでください。
delete item;
あなたは混ぜました
MyItem item;
MyItem
のインスタンスをスタックに割り当てます。インスタンスのメモリは、囲んでいるスコープの終わりに自動的に解放されます
そして
MyItem * item = new MyItem;
ヒープ上のMyItem
のインスタンスを割り当てます。ポインタを使用してこのインスタンスを参照し、delete item
の使用が終了したときに明示的にメモリを解放する必要があります。
まず、各メンバー変数宣言の後、MyItem
宣言の後、セミコロンを忘れてしまい、キーワード「struct」が間違って入力されたため、このコードはコンパイルされません。コードは次のようになります。
struct MyItem
{
var value;
MyItem* nextItem;
};
MyItem item = new MyItem;
あなたの質問に答えると、new演算子は作成されたオブジェクトへのポインタを返すため、このコードは機能しません(タイプMyItem*
)このポインタをMyItem
型の変数に割り当てようとしています。コンパイラーはこれを行うことを許可しません(値と変数の型が異なるため)。次のように、ポインタを適切な変数に保存する必要があります。
MyItem* item = new MyItem;
この場合、delete item
不要になったらメモリリークを回避します。
または、new
演算子を使用せずにスタック内にオブジェクトを作成できます。
MyItem item;
この場合、関数が戻るとオブジェクトは存在しなくなります。削除することを覚えておく必要はありません。
以下は、右側に記載されている変更を加えた編集済みのコードです。
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
ところで、あなたはする必要があります do new
しません。次のように、スタック上にMyItem
オブジェクトを作成できます。
MyItem anotherItem;