c********2 发帖数: 56 | 1 class Sample
{
public:
int *ptr;
Sample(int i)
{
ptr = new int(i);
}
~Sample()
{
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();
}
It seems perfect for me, how this lead to a dangling pointer? |
S****z 发帖数: 666 | 2 SomeFunc那里参数传递是值传递,浅拷贝了吧
【在 c********2 的大作中提到】 : class Sample : { : public: : int *ptr; : Sample(int i) : { : ptr = new int(i); : } : ~Sample() : {
|
c********2 发帖数: 56 | 3
什么是浅拷贝,大牛帮忙解释一下
【在 S****z 的大作中提到】 : SomeFunc那里参数传递是值传递,浅拷贝了吧
|
c********2 发帖数: 56 | |
e******0 发帖数: 211 | 5 函数传值 sample x,
形参和实参指向同一地址,
调用函数结束后,调用x的析构函数
所以实参所指的数据也被删除
【在 c********2 的大作中提到】 : 要怎么样改才安全
|
c********2 发帖数: 56 | 6
Got you, this explain my question, thx!
【在 e******0 的大作中提到】 : 函数传值 sample x, : 形参和实参指向同一地址, : 调用函数结束后,调用x的析构函数 : 所以实参所指的数据也被删除
|
a***y 发帖数: 2803 | 7 你要自己弄一个 copy constructor来做deep copy.
程序2次用到copy constructor,而你的class里面有一个 ptr指针型变量.
【在 c********2 的大作中提到】 : : Got you, this explain my question, thx!
|
a****l 发帖数: 8211 | 8 void SomeFunc(Sample *x) or
void SomeFunc(Sample &x)
【在 c********2 的大作中提到】 : 要怎么样改才安全
|
P********e 发帖数: 2610 | 9 this is not called dangling pointer.
this is called shallow copy
【在 c********2 的大作中提到】 : : Got you, this explain my question, thx!
|
c**b 发帖数: 2999 | 10 SomeFunc(Sample *x)算constructor还是copy constructor?
【在 a****l 的大作中提到】 : void SomeFunc(Sample *x) or : void SomeFunc(Sample &x)
|
|
|
c********2 发帖数: 56 | 11 class Sample
{
public:
int *ptr;
Sample(int i)
{
ptr = new int(i);
}
~Sample()
{
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();
}
It seems perfect for me, how this lead to a dangling pointer? |
S****z 发帖数: 666 | 12 SomeFunc那里参数传递是值传递,浅拷贝了吧
【在 c********2 的大作中提到】 : class Sample : { : public: : int *ptr; : Sample(int i) : { : ptr = new int(i); : } : ~Sample() : {
|
c********2 发帖数: 56 | 13
什么是浅拷贝,大牛帮忙解释一下
【在 S****z 的大作中提到】 : SomeFunc那里参数传递是值传递,浅拷贝了吧
|
c********2 发帖数: 56 | |
e******0 发帖数: 211 | 15 函数传值 sample x,
形参和实参指向同一地址,
调用函数结束后,调用x的析构函数
所以实参所指的数据也被删除
【在 c********2 的大作中提到】 : 要怎么样改才安全
|
c********2 发帖数: 56 | 16
Got you, this explain my question, thx!
【在 e******0 的大作中提到】 : 函数传值 sample x, : 形参和实参指向同一地址, : 调用函数结束后,调用x的析构函数 : 所以实参所指的数据也被删除
|
a***y 发帖数: 2803 | 17 你要自己弄一个 copy constructor来做deep copy.
程序2次用到copy constructor,而你的class里面有一个 ptr指针型变量.
【在 c********2 的大作中提到】 : : Got you, this explain my question, thx!
|
a****l 发帖数: 8211 | 18 void SomeFunc(Sample *x) or
void SomeFunc(Sample &x)
【在 c********2 的大作中提到】 : 要怎么样改才安全
|
P********e 发帖数: 2610 | 19 this is not called dangling pointer.
this is called shallow copy
【在 c********2 的大作中提到】 : : Got you, this explain my question, thx!
|
c**b 发帖数: 2999 | 20 SomeFunc(Sample *x)算constructor还是copy constructor?
【在 a****l 的大作中提到】 : void SomeFunc(Sample *x) or : void SomeFunc(Sample &x)
|
n*******e 发帖数: 62 | 21
都不是。只是一个普通涵数. copy constructor and constructor 是指类自己的构造
汗水。建议你在回去看看c++ 101吧。
【在 c**b 的大作中提到】 : SomeFunc(Sample *x)算constructor还是copy constructor?
|
O*******d 发帖数: 20343 | 22 SomeFunc里的ptr和s1的ptr指向同一个东西。
delete ptr; 在SomeFunc被调用。 |