c中什么时候需要深度复制?

When do we need deep copy in c

本文关键字:深度 复制 什么时候      更新时间:2023-10-16

在此代码中:

struct test
{
    char *p;
};
struct test glob;
void someFunc(struct test);
int main()
{
    struct test X;
    X.p=malloc(10);
    someFunc(X);
    //free(X.p);  
}

void someFunc(struct test y)
{
    glob.p=y.p;
}

在c++中,我认为这很棘手,因为当someFunc结束时,y继续超出作用域——如果有合适的析构函数,并且这是一个类y.p所指向的对象内存会在someFunc结束后释放,glob.p结束后也会释放会指向垃圾,对吧?

考虑上面相同的代码,在C中也是如此吗?或者glob.p会在someFunc结束后指向可用内存吗?

在C语言中,someFunc()结束后,y会被销毁,但y.p所指向的不会被销毁。在调用free()之前,可以一直使用分配的内存——这是动态分配的优点之一(也是缺点之一——能力越大责任越大)

在c++中,也会发生同样的事情,除非有一个析构函数删除指针。在这种情况下,是的,glob.pX.p都是无效指针。

在c++中,相同的代码将与C中工作相同。当您传递指针时,两者都应该是好的。你只需要知道谁拥有它,从而删除它。

如果像前面所说的那样编写析构函数,通常还应该提供适当的复制和赋值操作符。http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)来防止诸如无效指针之类的事情。

如果你不这样做,是的,这样的代码将是危险的,你需要非常清楚你在做什么(尤其是为什么要这样做)。

someFunc结束后,glob.p将指向main中调用malloc所分配的内存。无论将其编译为C还是c++程序(在c++情况下将structsomeFunc声明中删除),都是如此。如果test作为c++类有不同的定义,就像你在最后问的那样,那么在someFunc结束时会发生什么完全取决于这个定义的细节。