c中什么时候需要深度复制?
When do we need deep copy in c
在此代码中:
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()
之前,可以一直使用分配的内存——这是动态分配的优点之一(也是缺点之一——能力越大责任越大)
glob.p
和X.p
都是无效指针。
在c++中,相同的代码将与C中工作相同。当您传递指针时,两者都应该是好的。你只需要知道谁拥有它,从而删除它。
如果像前面所说的那样编写析构函数,通常还应该提供适当的复制和赋值操作符。http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)来防止诸如无效指针之类的事情。
如果你不这样做,是的,这样的代码将是危险的,你需要非常清楚你在做什么(尤其是为什么要这样做)。
在someFunc
结束后,glob.p
将指向main
中调用malloc
所分配的内存。无论将其编译为C还是c++程序(在c++情况下将struct
从someFunc
声明中删除),都是如此。如果test
作为c++类有不同的定义,就像你在最后问的那样,那么在someFunc
结束时会发生什么完全取决于这个定义的细节。
相关文章:
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- C++尝试深度复制唯一指针时出现内存访问冲突
- 在 c++ 中使用深度复制的运算符重载
- 如何深度复制链表对象指针
- 我有两棵二叉树.我想在不更改输入树的情况下深度复制两个二叉树的结果
- 如何将结构深度复制到向量的每个元素
- 我需要做一个深度复制,我是否正确使用了我的复制构造函数?
- 是否可以在不显式迭代每个元素的情况下深度复制指针容器?
- 如何深度复制unique_ptr向量
- 二叉搜索树 深度复制和取消引用
- 链表的这个别名运算符是否会产生深度复制
- 有没有一种 stl 方法来执行指针向量的深度复制
- cv::P oint3f 赋值运算符是否执行"深度"复制?
- Qt:通过深度复制访问列表中的数据结构是否应该比通过指针访问它慢得多
- 深度复制包含引用成员(C++)的结构
- 如何将“char *”深度复制到std::stringstream
- 如何在双向链表上执行深度复制
- 在复制构造函数中执行深度复制
- 深度复制cv::垫子替代品,哪个更好?
- 在 C/C++ 中使用 ProtoBuf 进行深度复制