假设,我有以下代码:
class Data
{
private:
int *m_arr;
int m_size;
bool m_deAlloc;
public:
Data(int *arr, int size): m_arr(arr), m_size(size), m_deAlloc(false) {}
~Data(){ if(m_deAlloc) delete[] m_arr; }
...
};
void foo(Data &d)
{
// uses d ...
}
void foo_wrapper(int *arr, int size)
{
Data d(arr, size); // should I create it as new Data(arr, size)?
foo(d); // asynchronous call...
} // ~Data() will be called but m_arr array will not be erased...
int main()
{
int *arr = new int[...];
...
foo_wrapper(arr,...); // internally calls foo asynchronously...
...
// wait for foo execution completion....
...
delete[] arr;
}
我用 gcc 尝试过,它显然可以工作,但我认为它不是一个有效的程序,因为从“foo_wrapper”传递给“foo”的“数据”引用可能是无效的,因为传递的对象的析构函数可能在 foo 完成执行之前被调用(异步执行)。虽然我没有删除数据(m_arr),但是当调用析构函数时对象引用仍然会发生什么?
C++ (gcc) 编译器是否只调用析构函数。例如,当调用对象“d”的析构函数时,它是否会重新分配对象“d”的内存分配并将“d”设置为某个无效引用?