【发布时间】:2014-09-22 07:40:10
【问题描述】:
即使对象是通过普通的方式传递给函数的 按值调用的参数传递机制,理论上可以保护 并隔离调用参数,它仍然是可能的一方 发生可能影响甚至损坏用作对象的对象的效果 争论。例如,如果用作参数的对象分配 内存并在销毁时释放该内存,然后释放其本地副本 当函数的析构函数为 叫。这将使原始对象损坏并有效 没用。
这是用 C++ 编写的:完整参考
在这个程序中
#include<iostream>
using namespace std;
class Sample
{
public:
int *ptr;
Sample(int i)
{
ptr = new int(i);
}
~Sample()
{
cout<<"destroyed";
delete ptr;
}
void PrintVal()
{
cout << "The value is " << *ptr;
}
};
void SomeFunc(Sample x)
{
cout << "Say i am in someFunc " << endl;
}
int main()
{
Sample s1= 10;
SomeFunc(s1);
s1.PrintVal();
}
当对象 s1 从对象返回时被销毁,它会产生一个运行时错误。我不知道为什么会发生这种情况,因为应该制作一个副本。 我想可能是因为类定义中没有复制构造函数。但是我惊讶地发现如果使用这个函数声明
void SomeFunc(Sample &x)
{
cout << "Say i am in someFunc " << endl;
}
在这个声明中没有发生错误。错误是否也应该在这里发生,因为它被引用了? 谁能解释一下这两种情况会发生什么。
【问题讨论】:
-
你了解引用传递是什么意思吗?
-
复制构造函数为何有用的好例子
-
@Claptrap 是一个很好的例子,说明为什么您不应该自己处理内存并让智能指针来处理。比三/五规则更好的是rule of zero
-
@JBL 在某些情况下无法使用智能指针,例如遗留代码或流程规则。
-
@Claptrap 当然,但由于 OP 不是在这种情况下而是在学习,让我们首先指向现代实践,如果需要出现,遗留黑客:)
标签: c++