c++ - 如何判断哪个类拥有指针

标签 c++ pointers smart-pointers

我正在观看一个关于智能指针的视频(下面的视频链接),它确定了传统 C++ 指针的以下问题:

你无法分辨谁拥有指针

Hebert 继续给出以下示例:类 A 有一个指向 float 的指针,类 B 有一个指向相同 float 的指针。两者中的哪一个拥有指针?好吧,你看不出来……不清楚……我们不知道删除指针是谁的工作……不好……令人费解……难以调试。

他到底在说什么?我们怎么不知道哪个类拥有指针呢?如果指针是作为类 A 或 B 的实例的一部分创建的,那么它不会简单地分别是 A->myPointer 和 B->myPointer 吗?

谢谢 :^) 基思

https://www.youtube.com/watch?v=Jc9n9BcYSj4
大约在 1:00

编辑

#include <iostream>
class A {
public: float * f_ptr;
};
class B {
public: float * f_ptr;
};
int main() {
    float f=2.71;
    A* a = new(A);
    B* b = new(B);
    a->f_ptr = &f;
    b->f_ptr = &f;
    std::cout << "a->f_ptr: " << *a->f_ptr << std::endl;
    std::cout << "b->f_ptr: " << *b->f_ptr << std::endl;
    delete a;
    delete b;
    std::cout << std::endl;
}

/************
OUTPUT

a->f_ptr: 2.71
b->f_ptr: 2.71

*/

编辑 2

下面的帖子很好地解释了这个现象:
http://ericlavesson.blogspot.com/2013/03/c-ownership-semantics.html

最佳答案

当他说某个类“拥有指针”时,这意味着该类负责清理指针造成的困惑。您可以有两个不同的类 A 和 B,它们使用指向同一对象的指针。除非你是这些类的设计者,否则你无法分辨最后应该删除哪个对象并在它之后进行清理,例如解锁一些资源。你无法通过使用一些内置的语言语义来弄清楚或设置它 - 你必须被告知它,例如通过文档。如果设计不好,您最终可能会得到两个类试图在同一个对象之后清理两次或者根本不在对象之后清理。

从技术上讲,这是关于谁拥有指针指向的内存,而不是指针本身,但大多数人在谈论拥有指针时都会引用我上面描述的问题。

关于c++ - 如何判断哪个类拥有指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41556155/

相关文章:

c++ - 为什么在这种情况下内联函数会花费更多时间?代码如下 :

c++ - Eclipse CDT 将 static_assert(cond) 突出显示为语法错误

c++ - 混淆复制构造函数和私有(private)成员

c - 将表指针从 C 传递到汇编函数

c++ - 指针还是索引?

提取字符串崩溃的代码

c++ - 在没有其他智能指针的情况下创建weak_ptr

c++ - 从不同的库访问相同的命名空间

sockets - 带有 addrinfo 结构的智能指针

c++ - 如果原始指针超出范围,智能指针是否保留分配的内存?