【问题标题】:Syntax Error when using 'delete' [duplicate]使用“删除”时出现语法错误 [重复]
【发布时间】:2015-08-20 03:38:49
【问题描述】:

我在使用“删除”运算符时遇到问题。 VS2013 使用 2013 年 11 月的 CTP 编译器将其识别为语法错误,并给出消息:“预期声明”。代码如下:

int a = 1;
int* p = &a;

int* snj = new int[10];

delete p;
delete[] snj;

【问题讨论】:

  • 这是完整的代码吗?
  • 你必须把代码放在一个函数中。
  • 是的,已经完成了。
  • delete 不应该是语法错误(假设此代码在函数体中),但删除不是通过new 获得的指针是逻辑错误。
  • @RaymondChen 将代码放入函数中有效。我可以问为什么吗?附言对不起,我只是一个初学者。 :)

标签: c++ pointers syntax


【解决方案1】:

C++ 不允许您在 Python 或其他语言等顶级语言中编写任意表达式。您需要将代码放在一个函数中,在这种情况下可能是 main

int main()
{
    int a = 1;
    int* p = &a;

    int* snj = new int[10];

    delete p;
    delete[] snj;
}

请注意,在未使用 new 分配的指针上使用 delete 是未定义的行为。

此类内容非常基础,应该包含在您的入门书籍中。如果您没有入门书,请get one

【讨论】:

  • 虽然您的答案在语义上是正确的,但如果没有 return 语句,它就不是有效代码
  • @EdChum 你是什么意思? main 有一个隐含的return 0;
  • 真的,我以为你必须明确return 0; 或其他什么,对我来说是个消息
  • Nope.
  • OK 找到 this 我收回了
【解决方案2】:

p 指向 a 的地址。 a 是贴在堆栈上的局部变量。您只能在动态分配的堆内存(使用 new 关键字创建的任何变量)上调用 delete。

a 超出范围时会自动删除。

【讨论】:

    【解决方案3】:

    你不应该删除 p,因为它不是指向堆元素,而是指向栈元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      • 2020-09-28
      • 2018-05-21
      相关资源
      最近更新 更多