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

时间:2012-03-20 03:23:37

标签: c++ reference shared-ptr

当你将类成员声明为对shared_ptr的(const)引用时,有没有办法用g ++来检测?我看不出这个有用的时间,但如果你不小心宣布该成员作为参考,你可以结束一些难以发现的错误,如果你的引用数量过早地达到零(因为该成员不是按价值持有)。

或者,您是否只是仔细编写代码并依赖同行评审?

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

1 个答案:

答案 0 :(得分:1)

没有编译器会提供一种工具来查找变量是否为引用。创建引用变量是一项非常简单的操作,大多数时候意图是真实的。对代码中存在的所有引用进行编译警告会很烦人。

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

但是,如果你想自己检测它,我现在可以想到一个黑客攻击。我们可以利用引用必须在构造函数中始终初始化这一事实。您可以为所有类创建一个具有故意奇怪语法的公共构造函数。例如:

#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
};

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