Как узнать, какой указатель указывает на конкретный объект в c/ C++?

Я хочу знать, какие указатели указывают на конкретный объект во время выполнения в c/ C++.

Например, у меня есть объект A, теперь я хочу сделать что-то для A, например, изменить адрес памяти A, в этот момент я должен знать, сколько есть указателей, указывающих на A, и, по крайней мере, на имя из этих указателей во время выполнения.

На самом деле я просто хочу осуществить миграцию объекта или некоторых других данных, не делая программу неправильной. Потому что в c/ C++, если я хочу перенести объект A, я должен выяснить, сколько указателей указывает на объект A, а затем сделать эти указатели, указывающие на новый адрес, который является адресом объекта A после миграции.

В общем и целом, ему нравится std:: shared_ptr, и я также реализовал определенный класс для достижения этой цели. Но сейчас я просто хочу знать, есть ли способы достичь этой цели с помощью некоторых инструментов компилятора, таких как LLVM, без изменения исходного кода или автоматического изменения исходного кода.

*******описание проблемы**********

Фактически, у меня есть два типа памяти, typeA и typeB, и теперь я хочу реализовать функцию, которая может переносить объект X в typeA в typeB. Чтобы убедиться в достоверности программ, после переноса объекта X из типа A в тип B я должен знать, сколько указателей указывают на объект X и чем заставить эти указатели указывать на новый адрес объекта X.

2 ответа

Я хочу знать, какие указатели указывают на конкретный объект во время выполнения в c/ C++.

В общем, это невозможно. Кстати, похоже, что вы хотите реализовать нечто очень похожее на сборщик мусора с точным копированием. Если вам это не понятно, прочитайте руководство GC (для понятий и терминологии). Обратите внимание, что переменные (и их имена) не существуют во время выполнения (тогда релевантны только области памяти, возможно, в стеке вызовов), но только во время компиляции.

Вообще говоря, ему нравится std::shared_ptr и я также реализовал определенный класс для достижения этой цели. Но сейчас я просто хочу знать, есть ли способы достичь этой цели с помощью некоторых инструментов компилятора, таких как LLVM, без изменения исходного кода или автоматического изменения исходного кода.

Опять же в общем то не возможно. Для интуиции о том, почему, представьте, что вы имеете дело с union { Foo* fooptr; std::uintptr foonum; }; который на самом деле различается по некоторому произвольному внешнему свойству, например, по странности вашего текущего pid. Если бы вы могли решить, что вы решили проблему остановки. Читайте также о теореме Райс. Оба очень важны для статического анализа исходного кода.

Однако то, что вы могли бы сделать, это явно определить некоторые дополнительные строгие правила и ограничения кодирования (возможно, с некоторой вспомогательной библиотекой времени выполнения), а также спроектировать и реализовать, например, с помощью LLVM или некоторого плагина GCC, статического анализатора, который проверяет эти правила и ограничения кодирования.

Обратите внимание, что на практике вы можете использовать некоторые GC с C++, например GC от Boehm или
Равенбрук MPS.

В вашем вопросе по-прежнему отсутствует реальная мотивация (которую я пытаюсь угадать), и он выглядит как проблема XY. "Как GC" недостаточно.

Смотрите также это. Возможно, читайте о динамическом обновлении программного обеспечения или контрольных точках приложения.

добавлений

Ваша проблема (даже с редактированием описания проблемы, я ее плохо понимаю) похожа на копирование методов сбора мусора, таких как алгоритм Чейни.

Для этого вы можете создать класс, в котором будет записано количество ссылок и каждое имя ссылки. Как это

class custom_obj {
    Custom A;  // target object
    int count_ptr;  // reference count
    vector<void*> ref_ptr;  // reference pointer
};

Это простой способ.

Другие вопросы по тегам