Как узнать, какой указатель указывает на конкретный объект в 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
};
Это простой способ.