我有这个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 ++进行编译。那是什么意思?这是怎么回事?
答案 0 :(得分:28)
尝试:
MyItem * item = new MyItem;
但不要忘记在使用后删除它:
delete item;
答案 1 :(得分:21)
你已经混合了
MyItem item;
在堆栈上分配MyItem
的实例。实例的内存将在封闭范围的末尾自动释放
和
MyItem * item = new MyItem;
在堆上分配MyItem
的实例。您将使用指针引用此实例,并且在使用delete item
完成后将需要显式释放内存。
答案 2 :(得分:6)
首先,这段代码不会编译,因为你在每个成员变量声明之后和MyItem
声明之后忘记了分号,而输入的关键字“struct”是错误的。您的代码应如下所示:
struct MyItem
{
var value;
MyItem* nextItem;
};
MyItem item = new MyItem;
现在回答你的问题,这段代码不起作用,因为new运算符返回一个指向所创建对象的指针(类型为MyItem*
的值)并且你试图将这个指针赋给{{1}类型的变量1}}。编译器不允许您这样做(因为值和变量具有不同的类型)。您应该将指针存储到适当的变量中,如下所示:
MyItem
在这种情况下,您必须记住MyItem* item = new MyItem;
,以便在您不再需要时避免内存泄漏。
或者,您可以在没有delete item
运算符的情况下在堆栈中创建对象。
new
在这种情况下,当函数返回时,对象不再存在;你不需要记得删除它。
答案 3 :(得分:3)
以下是经过编辑的代码,右侧提到了更改
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
顺便说一句,你不必须做new
。您可以在堆栈上创建一个MyItem
对象
MyItem anotherItem;