如果我们直接 return class 实例的内存位置会发生什么?

What happens if we directly return class instance's memory location?

主要功能代码:

PNG* allocate(size_t w, size_t h) {
    PNG ret(w, h);
    return &ret;
}

int main() {
    PNG * image = allocate(256, 512);
    delete image;
    return 0;
}

假设定义了适当的 PNG class。我的问题是关于 allocate(); &ret。通常调用函数后,每个创建的实例都会被清除(只有数据是新复制的)。在这种情况下,&ret 指向新创建的 ret 的位置。但是好像function是运行之后,ret会被删除,结果PNG * image会乱七八糟。

这是真的吗?如果是这样,修复代码的方法是什么?

此外,图像不是由 new 创建的,所以使用 delete 是否明智?

从字面上回答您的问题,修复此代码的方法是不要在调用 new.[=15= 后未提供给您的任何指针上调用 delete ]

delete 做了两件事:

  1. 它调用对象的析构函数
  2. 它将对象的内存释放回运行时的分配器

在这种情况下,在 allocate 中创建的 ret 对象将在函数退出时自动销毁,因此尝试调用其析构函数毫无意义。该对象也未分配到运行时提供的内存上,因此谈论释放该内存也毫无意义。

你正在返回一个函数局部对象的内存地址(临时),这意味着它已经在堆栈上创建。

当函数returns时,对象会被自动删除(出栈时)

在函数返回后访问此对象是未定义的行为,因为您现在正在读取不再分配给该对象的内存。

唯一应该使用 delete 的时候是在堆上分配内存时(通过使用 new