Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除对象时正则函数和虚函数的行为_C++_Class_Virtual - Fatal编程技术网

C++ 删除对象时正则函数和虚函数的行为

C++ 删除对象时正则函数和虚函数的行为,c++,class,virtual,C++,Class,Virtual,假设类A有一个常规成员函数和一个虚拟成员函数,我有两个指针指向同一个对象。假设一个ptr删除了对象,而另一个指针不知道。如果另一个指针尝试调用常规成员函数和虚拟成员函数,会发生什么情况 我理解删除对象后不建议使用指针,并强调常规函数与虚拟函数(甚至静态成员函数)之间的区别。编译器在编译时究竟如何处理常规函数、虚拟函数甚至静态函数 谢谢 如果您有两个指向同一对象的指针,并且您删除了其中一个,那么另一个指针将保留一个指针。尝试访问之后的任何内容都是未定义的行为。如果您有两个指向同一对象的指针,并且您

假设类A有一个常规成员函数和一个虚拟成员函数,我有两个指针指向同一个对象。假设一个ptr删除了对象,而另一个指针不知道。如果另一个指针尝试调用常规成员函数和虚拟成员函数,会发生什么情况

我理解删除对象后不建议使用指针,并强调常规函数与虚拟函数(甚至静态成员函数)之间的区别。编译器在编译时究竟如何处理常规函数、虚拟函数甚至静态函数


谢谢

如果您有两个指向同一对象的指针,并且您删除了其中一个,那么另一个指针将保留一个指针。尝试访问之后的任何内容都是未定义的行为。

如果您有两个指向同一对象的指针,并且您删除了其中一个,那么另一个将保留一个指针。尝试访问之后的任何内容都是未定义的行为。

大多数编译器将成员函数实现为“普通”函数,并带有名为“this”的附加指针参数

因此,只要您没有使用
这个
所指的任何东西,这样的成员函数就可以工作(但这样的函数可能不应该是成员)

虚拟函数的实现方式不同-
vtable
必须在调用函数之前通过
this
访问(以确定调用哪个函数)


请记住,这种差异是特定于实现的-对已删除对象调用任何方法都是未定义的行为,应该避免。

大多数编译器将成员函数实现为“普通”函数,并使用名为“this”的附加指针参数

因此,只要您没有使用
这个
所指的任何东西,这样的成员函数就可以工作(但这样的函数可能不应该是成员)

虚拟函数的实现方式不同-
vtable
必须在调用函数之前通过
this
访问(以确定调用哪个函数)


请记住,这种差异是特定于实现的-对已删除对象调用任何方法都是未定义的行为,应该避免这种行为。

非常确定这是UBAlready的答案,它链接到了优秀的“hotel room”答案。感谢您指向“hotel room”答案。我的问题实际上更强调常规函数和虚拟函数之间的区别。我理解删除对象后不建议使用指针。但编译器究竟是如何在编译时处理常规函数、虚拟函数甚至静态函数的呢?这是我更感兴趣的问题。也许我在上一篇文章中解释得不够好。在这方面,你能推荐一个答案吗?谢谢非常确定这是UBAlready在的答案,以及它链接到的优秀“hotel room”答案。感谢您指向“hotel room”答案。我的问题实际上更强调常规函数和虚拟函数之间的区别。我理解删除对象后不建议使用指针。但编译器究竟是如何在编译时处理常规函数、虚拟函数甚至静态函数的呢?这是我更感兴趣的问题。也许我在上一篇文章中解释得不够好。在这方面,你能推荐一个答案吗?谢谢谢谢你的回复。这就是我要找的!继续回答,如果普通函数没有使用这个指针,而是使用私有成员变量,那么它的行为如何?如果删除是在一个线程中执行的,而在另一个线程中使用的,那么删除是在访问之前完成的,我应该期待同样的行为吗?@Sarah:如果你从一个线程管理对象,并从另一个修改它们(或它们的指针等),您首先应该预料到麻烦:)但是是的-无论是谁或何时删除对象-它的悬空指针行为都是相同的-未定义。感谢您的回复。感谢您的回复。这就是我要找的!继续回答,如果普通函数没有使用这个指针,而是使用私有成员变量,那么它的行为如何?如果删除是在一个线程中执行的,而在另一个线程中使用的,那么删除是在访问之前完成的,我应该期待同样的行为吗?@Sarah:如果你从一个线程管理对象,并从另一个对象修改它们(或它们的指针等),您首先应该预料到麻烦:)但是是的-无论是谁或何时删除对象-它的悬空指针行为都是相同的-未定义。感谢您的回复。