Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.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++;删除具有有效地址的指针 我使用POCO C++库,引起奇怪的问题。 Poco使用自己的共享指针类SharedPtr进行内部指针操作。在我的例子中,静态对象Poco::SSLManager拥有SharedPtr证书处理程序对象的成员。当程序运行结束时,静态对象被删除,我捕捉到分段错误。 使用GDB调试器,我看到核心转储,不理解问题。删除SharedPtr对象时发生Seg故障(简单操作:delete pObj),但对象具有有效地址,如-0x8fcbed8_C++_Memory Management_Fork_Shared Ptr_Poco - Fatal编程技术网

C++;删除具有有效地址的指针 我使用POCO C++库,引起奇怪的问题。 Poco使用自己的共享指针类SharedPtr进行内部指针操作。在我的例子中,静态对象Poco::SSLManager拥有SharedPtr证书处理程序对象的成员。当程序运行结束时,静态对象被删除,我捕捉到分段错误。 使用GDB调试器,我看到核心转储,不理解问题。删除SharedPtr对象时发生Seg故障(简单操作:delete pObj),但对象具有有效地址,如-0x8fcbed8

C++;删除具有有效地址的指针 我使用POCO C++库,引起奇怪的问题。 Poco使用自己的共享指针类SharedPtr进行内部指针操作。在我的例子中,静态对象Poco::SSLManager拥有SharedPtr证书处理程序对象的成员。当程序运行结束时,静态对象被删除,我捕捉到分段错误。 使用GDB调试器,我看到核心转储,不理解问题。删除SharedPtr对象时发生Seg故障(简单操作:delete pObj),但对象具有有效地址,如-0x8fcbed8,c++,memory-management,fork,shared-ptr,poco,C++,Memory Management,Fork,Shared Ptr,Poco,为什么删除具有有效地址的指针会导致分段错误? 这可能是因为对象在应用程序的fork副本中创建,而在main中销毁?有效地址只是一个可访问的地址。这并不意味着它适合删除。您只能删除从new获得的内容。如果你没有新建它,你就不能删除它。删除静态或自动对象是未定义的行为-以及您可能从除new之外的任何其他来源获得的行为。您谈到使用共享指针时,请参见。如果该删除是pObj上的最后一次删除,则可能是该对象最后一次被删除。。因此,共享指针指向的对象最终将被销毁。在这种情况下,调用pObj的析构函数,可能从那

为什么删除具有有效地址的指针会导致分段错误?

这可能是因为对象在应用程序的fork副本中创建,而在main中销毁?

有效地址只是一个可访问的地址。这并不意味着它适合删除。您只能
删除
new
获得的内容。如果你没有
新建它,你就不能
删除它。删除静态或自动对象是未定义的行为-以及您可能从除
new
之外的任何其他来源获得的行为。您谈到使用
共享指针时,请参见。如果该删除是pObj上的最后一次删除,则可能是该对象最后一次被删除。。因此,共享指针指向的对象最终将被销毁。在这种情况下,调用pObj的
析构函数
,可能从那里得到Seg故障


另一方面,根据Poco库使用的共享指针的实现,可能是您通过调用delete错误地使用了共享指针。

正如另一方所说,并不是因为您的指针看起来像0x8fcbed8一样“好”,所以它才是正确的指针

事实上,如果使用“delete”,指针将保留其值。但是你不应该再使用它了。(最好在删除后将其设置为NULL,这样在调试器中它就会显示为“空”)

如果您使用linux开发,有一个工具可以帮助您找到问题所在。这是瓦尔格兰德:

valgrind  your_program  [args]
(只需在您通常启动的命令前面添加“valgrind”。如果还没有安装valgrind,您的发行版上必须有一个包,因为它是一个广泛使用的工具。)


然后valgrind将在程序运行时检查程序(稍微降低速度),并在您删除不应该删除的内容时立即报告您。(还有许多其他错误)

这是一个非常困难的问题,我不完全理解这个问题,但我试图解释它和我的解决方案。 这个问题是特定于平台的,只在GentooLinux上出现,带有GCC4.5.5编译器和Poco库

我有一个守护进程,它使用模块(插件)来处理不同的请求。模块和守护进程使用一个使用poco库的静态库。在静态库中,您可以使用代码创建SSL连接,从而创建SSL管理器。静态库链接到模块和deamon

在执事工作结束后,我的问题中描述了分段错误。我将静态库更改为共享库,问题消失了,没有seg故障。一切正常


真的,我不明白,但似乎这是gentoo上的gcc编译器错误。在其他带有其他gcc的linux上,所有操作都可以很好地使用静态库。

删除对象指针之前检查空指针,删除操作之后设置为空。SharedPtr通常具有
ptr->Release()
函数。检查一下out@Reddy:在调用
delete
之前不要检查
null
,因为它被定义为对
null
指针不执行任何操作。2 Gasim,在调用发布之前检查年份ptr,并在发布之后设置为null。此外,您永远不应该删除来自智能指针的任何内容。智能指针之所以被称为“智能”,是因为它们自己负责删除。当然,新指针是这样做的。但新的操作是在fork进程中进行的,而对象存储在静态对象(从共享库创建)中,而静态对象在父进程中销毁。我觉得这可能是冲突。您绝对不能跨进程删除。Poco SharedPtr看起来像智能ptr,使用内部原子计数器。我还检查了问题对象(InvalidCertificateHandler)的析构函数。它是一个简单的对象,没有父对象,只有一个bool变量。在析构函数中,我看到一些静态对象SSLManager方法的调用,但是在注释之后,应用程序的行为并没有改变。我认为您使用的共享ptr是错误的,但很难猜测。请编辑您的帖子并添加一些代码,如您在GCC4.5.5-4.4.5版本中构建和操作GentooLinux的代码行