我有这个C++代码:
#include <iostream>
using namespace std;
struct MyItem
{
  int value;
  MyItem* nextItem;
};
int main() {
    MyItem item = new MyItem;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
error: conversion from `MyItem*' to non-scalar type `MyItem' requested
Run Code Online (Sandbox Code Playgroud)
用g ++编译.那是什么意思?这是怎么回事?
tib*_*bur 30
尝试:
MyItem * item = new MyItem;
Run Code Online (Sandbox Code Playgroud)
但是不要忘记在使用后删除它:
delete item;
Run Code Online (Sandbox Code Playgroud)
        Nic*_*yer 22
你好了
MyItem item;
Run Code Online (Sandbox Code Playgroud)
它MyItem在堆栈上分配一个实例.实例的内存将在封闭范围的末尾自动释放
和
MyItem * item = new MyItem;
Run Code Online (Sandbox Code Playgroud)
它MyItem在堆上分配一个实例.您将使用指针引用此实例,并且在完成使用时将需要显式释放内存delete item.
首先,此代码将无法编译,因为您在每个成员变量声明之后MyItem和声明之后忘记了分号,并且关键字"struct"输入错误.您的代码应如下所示:
struct MyItem
{
var value;
MyItem* nextItem;
};
MyItem item = new MyItem;
Run Code Online (Sandbox Code Playgroud)
现在回答你的问题,这段代码不起作用,因为new运算符返回一个指向所创建对象的指针(类型的值MyItem*),并且你试图将这个指针赋给一个类型的变量MyItem.编译器不允许您这样做(因为值和变量具有不同的类型).您应该将指针存储到适当的变量中,如下所示:
MyItem* item = new MyItem;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您必须记住在delete item不再需要时避免内存泄漏.
或者,您可以在没有new运算符的情况下在堆栈中创建对象.
MyItem item;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,当函数返回时,对象不再存在; 你不需要记得删除它.