c++ - 使用 g++ 检测 shared_ptr 类成员引用

标签 c++ reference shared-ptr

当您将类成员声明为对 shared_ptr 的(常量)引用时,是否有一种方法可以使用 g++ 进行检测?我看不出这会有用的时候,但是如果你不小心将成员声明为引用,你可能会遇到一些难以发现的错误,如果你的引用计数过早地达到零(因为成员不是按值(value)持有)。

或者这是一种您只是仔细编写代码并依赖同行评审的情况?

编辑:我正在考虑与进行特定检查的printf 格式字符串检查/警告类似的内容。例如检查 shared_ptr 的东西,而不是一般的“引用成员”警告。

最佳答案

没有 编译器会提供一种工具来查找变量是否是引用。创建一个引用变量是一个非常微不足道的操作,而且大多数情况下都是真实的。为代码中存在的所有引用获取编译警告会很烦人。

查明变量是否被错误声明为引用的好方法是进行同行评审。

但是,如果您想自己检测它,我现在可以想到一种破解方法。我们可以利用引用必须在构造函数中始终初始化这一事实。您可以为所有类创建一个带有故意怪异语法的通用构造函数。示例:

#define REFERENCE_CHECK(CLASS) CLASS(int***, char***)

class A {  // case [1]
  REFERENCE_CHECK(A) {}
};

class B {  // case [2]
  X &p;  // genuine reference
  REFERENCE_CHECK(B) : p(*new X) {}  // register with the constructor
};

class C {  // case [3]
  shared_ptr<int> &p;
  REFERENCE_CHECK(C) {} // compiler error, because 'p' is not registered
};

这是一个伪代码;请记住,如果需要,您可能还必须分别注册基类和虚拟类。

关于c++ - 使用 g++ 检测 shared_ptr 类成员引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9780957/

相关文章:

c++ - `*this` 可以是 `move()` d 吗?

c++ - 从 MFC 中的工作线程调用 Beginwaitcursor 函数

c++ - 在 C++ 中重命名(别名/转发)函数的最佳方法是什么?

c++ - 标准调用和 cdecl

c++ - 我什么时候使用引用?

JavaScript var 引用。有人可以向我解释primitive 和 objs/array 之间有什么区别吗?

C++ 协变和引用

c++ - 将对象传递给期望 shared_ptr 的函数而不实际共享所有权

visual-studio-2010 - 从托管代码中包含时未定义 shared_ptr

c++ - pcl 使用共享指针,它会复制吗?