Поддерживает ли GCC запрос текущего диапазона стека? - PullRequest
2 голосов
/ 02 сентября 2010

Мне интересно, можно ли определить, находится ли данный адрес в стеке или в куче. Я хотел бы этого, потому что система подсчета ссылок, которую мы используем, имеет недостаток, заключающийся в том, что если умный указатель каким-то образом указывает на объект в стеке, могут случиться плохие вещи. Если бы у меня была эта функциональность, я мог бы использовать ее для раннего обнаружения этой ошибки и выдать ее, чтобы разработчик, который делает это, был вынужден немедленно решить эту проблему.

Ответы [ 3 ]

2 голосов
/ 02 сентября 2010

Любое решение должно зависеть от платформы.В Windows вы можете использовать HeapWalk для перечисления всех кусков памяти в куче.В Unix вы можете попробовать использовать pthread_attr_getstack ().

2 голосов
/ 02 сентября 2010

Прямой ответ на ваш вопрос заключается в том, что GCC поддерживает встроенный язык ассемблера, который позволит вам сравнивать указатели с указателем стека.

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

1 голос
/ 02 сентября 2010

Нет, невозможно или поддерживается.(Ну, это может быть возможно, если вы хотите положиться на неопределенное или определяемое реализацией поведение ... Я настоятельно советую вам не делать этого.) Типичное объяснение стека и кучи, преподаваемой на курсах по информатике,очень мало общего с тем, как работают реальные системы (использующие виртуальную память).

Вообще говоря, оно того не стоит.(Если бы это было так, std::auto_ptr, std::unique_ptr, или boost::shared_ptr, или boost::scoped_ptr сделали бы это). Пользователи C и C ++ обычно привыкли работать с API, которые допускают неопределенное поведение, если пользователь делает что-то глупое.Особенно, когда речь идет о местах хранения (стек по сравнению со свободным магазином).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...