如果我们直接 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
做了两件事:
- 它调用对象的析构函数
- 它将对象的内存释放回运行时的分配器
在这种情况下,在 allocate
中创建的 ret
对象将在函数退出时自动销毁,因此尝试调用其析构函数毫无意义。该对象也未分配到运行时提供的内存上,因此谈论释放该内存也毫无意义。
你正在返回一个函数局部对象的内存地址(临时),这意味着它已经在堆栈上创建。
当函数returns时,对象会被自动删除(出栈时)
在函数返回后访问此对象是未定义的行为,因为您现在正在读取不再分配给该对象的内存。
唯一应该使用 delete
的时候是在堆上分配内存时(通过使用 new
)
主要功能代码:
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
做了两件事:
- 它调用对象的析构函数
- 它将对象的内存释放回运行时的分配器
在这种情况下,在 allocate
中创建的 ret
对象将在函数退出时自动销毁,因此尝试调用其析构函数毫无意义。该对象也未分配到运行时提供的内存上,因此谈论释放该内存也毫无意义。
你正在返回一个函数局部对象的内存地址(临时),这意味着它已经在堆栈上创建。
当函数returns时,对象会被自动删除(出栈时)
在函数返回后访问此对象是未定义的行为,因为您现在正在读取不再分配给该对象的内存。
唯一应该使用 delete
的时候是在堆上分配内存时(通过使用 new
)