请求从'myItem *'转换为非标量类型'myItem'

时间:2010-10-12 23:38:44

标签: c++ new-operator

我有这个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 ++进行编译。那是什么意思?这是怎么回事?

4 个答案:

答案 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;