从这段代码:
int x = 5;
int other = 10;
vector<int*> v_ptr;
v_ptr.push_back(&x);
v_ptr.push_back(&other);
v_ptr.push_back(&x);
无论如何,我可以从x
变量本身知道谁在x
指向,因此我无需在v_ptr
内搜索x
的地址}?这在C ++或C ++ 0x中是否可行?
我读到在进行垃圾收集时,他们查看内存并查看是否有任何指示,然后决定删除未使用的变量等。
答案 0 :(得分:18)
没有。这就像问一个人他们是否认识所有知道他们地址的人。
答案 1 :(得分:3)
不,你不知道什么是x的引用而没有遍历你指定它的可能位置(v_ptr
)
- 或 -
如果你必须这样做,你可能想做一些有点参考跟踪(可以用于垃圾收集),如
v_ptr[0]=add_reference(&x,&v_ptr[0]);
其中add_reference是一个函数,有一个对第一个参数的引用列表,引用者作为第二个参数(对于STL类型可能很棘手)
答案 2 :(得分:1)
不,不可能知道谁指向x。
此外,C ++不是垃圾回收。
即使你对x使用shared_pointer,你也可以找出x有多少指针,但不知道它们是谁。
答案 3 :(得分:1)
不,用原始指针无法知道这一点。
某些类型的“智能指针”(实际上是包含指针的对象以及关于指针的其他元数据)将元数据的一部分保存为其他指向对象的列表或计数。智能指针。在垃圾收集语言中,此机制用于确定是否不再引用对象,但它不是标准C或C ++指针的特征。
答案 4 :(得分:1)
除了这里的其他准确答案之外,请注意在垃圾收集语言(C ++。NET,我猜或任何其他正常的,Java / C#等)中,垃圾收集的一种技术是遍历引用,标记所指向的一切。
但请注意,这实际上是另一个方向。我从一组已知的对象开始,并跟随他们所有的链接到其他对象等。我通常永远不能说“给定这个对象,让我计算谁指向它或保留对它的引用”。
答案 5 :(得分:0)
你的实际问题的答案是否定的,C ++没有一种机制来确定有多少引用仍处于活动状态。尽管如此,虽然C ++不是垃圾收集,但如果您感兴趣,可以尝试使用其中一个gc_classes。这是一个stackoverflow帖子,列出了其中一些:Garbage collection Libraries in C++
答案 6 :(得分:0)
是,可以知道 - 在执行的给定点 - 是否有指向您变量的指针。您需要做的就是跟踪分配给流程中每个变量的内存。这意味着知道堆栈和堆的起始和结束地址。然后,您可以在这些地址范围内对变量的位置进行简单的顺序搜索。
虽然迭代那些相对较小的内存部分不应该花费很长时间,但您可以通过维护仅跟踪引用的结构来牺牲一些额外的内存开销和指针创建开销来优化搜索时间。这为您提供了一个较小的搜索列表。