我想知道哪些指针在c / c ++ 中指向运行时的特定对象。
例如,我有一个对象 A ,现在我想为A做一些事情,例如更改 A 的内存地址,此时我必须知道有多少指针指向A,并且至少在运行时指向这些指针的名称。
事实上,我只想实现对象或其他数据的迁移,而不会使程序错误。因为在c / c ++中我想要迁移对象A 我必须弄清楚有多少指针指向对象A ,而不是让这些指针指向新地址这是迁移后对象A 的地址。
总的来说,它喜欢 std :: shared_ptr ,而且我也实现了一个自定义类来实现这个目标。但是现在,我只是想知道是否有一些方法可以通过使用一些编译工具(如LLVM)和来实现这一目标,而无需修改源代码或自动修改源。
*******问题描述**********
实际上,我有两种类型的内存, typeA 和 typeB ,现在我想实现一个可以将typeA中的对象X迁移到typeB的函数。为了确保程序的有效性,在将对象X表单typeA迁移到typeB之后,我必须知道有多少指针指向对象X而不是使这些指针指向对象X的新地址。
答案 0 :(得分:2)
我想知道哪些指针在c / c ++中指向运行时的特定对象。
一般情况下,这是不可能的。顺便说一句,看起来你想要实现与精确复制垃圾收集器非常相似的东西。如果您不清楚这一点,请阅读the GC handbook(有关概念和术语)。请注意,变量(及其名称)在运行时不存在(只有memory locations,可能在call stack上是相关的),但仅在编译时。
总的来说,它喜欢
std::shared_ptr
,我也实现了一个自定义的类来实现这个目标。但是现在,我只是想知道是否有一些方法可以通过使用一些编译器工具(如LLVM)来实现这一目标,而无需修改源代码或自动修改源代码。
同样,一般来说这是不可能的。为了直觉了解为什么,想象一下你处理的union { Foo* fooptr; std::uintptr foonum; };
实际上被一些任意的外部属性所区分,例如你当前pid的奇怪之处。如果你能解决,你已经解决了halting problem。另请阅读Rice's theorem。两者都与static source code analysis非常相关。
但是, 设计和实施,例如使用LLVM或一些GCC插件,静态分析器检查这些编码规则和约束。
请注意,在实践中,您可以使用一些带有C ++的GC,例如: Boehm's GC或
Ravenbrook's MPS.
你的问题仍然缺乏真正的动机(我试图猜测),看起来像XY problem。 “像GC一样”还不够。
另见this。也许请阅读dynamic software updating或application checkpointing。
你的问题(即使是问题描述编辑,我也不太了解)看起来类似于复制垃圾收集技术,如Cheney's algorithm。
答案 1 :(得分:0)
为此,您可以创建一个记录引用量和每个引用名称的类。喜欢这个
class custom_obj {
Custom A; // target object
int count_ptr; // reference count
vector<void*> ref_ptr; // reference pointer
};
这是一个简单的方法。