我正在观看有关智能指针的视频(下面的vid链接),它标识了传统C ++指针的以下问题:
您无法告诉谁拥有指针
Hebert继续给出以下示例:A类有一个指向float的指针,B类有一个指向同一个float的指针。哪两个拥有指针?好吧,你不能说......它不清楚......我们不知道它的工作是什么,删除指针...... .bad ..复杂......难以调试。
他在说什么?我们怎么不知道哪个类拥有指针?如果指针是作为A类或B类实例的一部分创建的,那么它不仅仅是A-> myPointer和B-> myPointer吗?
Thx:^)Keith
https://www.youtube.com/watch?v=Jc9n9BcYSj4
大约凌晨1点
$('.constraint_entry').change(function () {
if($(this).is(":checked")){
$(target).addClass('fp-section');
}
else{
$(target).removeClass('fp-section');
}
});
以下文章很好地解释了这一现象:
http://ericlavesson.blogspot.com/2013/03/c-ownership-semantics.html
答案 0 :(得分:1)
好的或坏的,但是C和C ++语言没有对指针所指向的内存的所有权建立任何规则。这具有非常深远的影响。截至今天,在此处制定任何规则为时已晚。吨和现有代码将被打破。
可以决定谁拥有指针以及谁只使用它的应用程序级别。但这将是应用程序员的决定,而不是语言规则。此决定应记录在案(通常使用评论)并传达给将继续使用此代码的人员。
有些人认为明确的所有权是一种不好的做法,聪明的指针是正确的方法。有些人认为具有明确所有权的模式仍然可以。
答案 1 :(得分:1)
指针本身(地址)与指向的内存之间存在差异。
每个类都拥有它的指针,但技术上没有人拥有指向的内存。它 必须以某种方式管理(如果它是未分配的,它是一个段错误;如果它被解除分配两次,它是双重释放;如果它根本没有释放它是一个内存泄漏)但这纯粹依赖于程序员。可以让一个类负责一些内存(通过让这个类的构造函数和析构函数来管理它),但这纯粹是一种约定,而不是一种语言特性。如果他们获得了地址/指针的副本,那么其他类不会被剥夺释放或重新分配这个内存的权利(虽然这通常是一个非常糟糕的主意)。
答案 2 :(得分:1)
当他说某些类"拥有指针"时,这意味着这个类负责清理指针所造成的混乱。您可以使用两个不同的类A和B,它们使用指向同一对象的指针。除非您是这些类的设计者,否则您无法告诉哪一个应该最终删除该对象并在其后进行清理,例如:解锁一些资源。你不能通过使用一些内置语言语义来解决或设置它 - 你必须被告知它,例如通过文档。如果设计不好,你最终可能会有两个类试图在同一个对象之后清理两次,或者根本不清理对象。
从技术上讲,它是关于谁拥有指针所指向的内存,而不是指针本身,但是大多数人在谈论拥有指针时都会引用我上面描述的问题。
答案 3 :(得分:1)
智能指针很少能解决所述问题。但它们通常是另一个问题的解决方案。
此处列出的问题是共享所有权问题。当A
和B
'拥有'资源时,谁负责释放资源? std::shared_pointer
是一个引用计数指针,一旦它的所有用户都消失了就会释放资源。但是,应该避免这种情况。在程序中共享指针使得争论资源的生命周期变得非常困难。尽管使用shared_pointer
(通常是多线程队列的情况)的情况很少,但最好还是尽量避免共享所有权 - 就像在现实生活中一样,顺便说一下:)。相反,将一个类作为所有者,将另一个作为用户,并以这样的方式设计您的界面,使用户永远不会超过所有者。它并不像看起来那么难,而且这种设计将在更容易的程序维护中得到回报。
确定所有者后,std::unique_ptr
是一种方法。它为您提供指针的无忧生命时间,等于父对象的生命周期,防止危险的复制分配,并且是异常安全的。