2010-06-11 6 views
1

При использовании перезаписываемой случайной памяти в MSVC можно проверить состояние кучи в разных точках с вызовом _CrtCheckMemory и знать, по крайней мере, с небольшим уровнем уверенности в том, что код до проверки не отвечает для любых ошибок, которые могут привести к сбою новых или malloc позже.GCC/XCode эквивалент _CrtCheckMemory?

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

ответ

0

Эта функция фактически встроена в кучу в GCC. Как описано here Самый простой способ, чтобы включить это на XCode :: Run меню: Enable Guard Malloc

-1

Это не касается вашего вопроса напрямую, но я чувствовал себя вынужденным ответить. Как вы говорите, инструменты, подобные функциям проверки CRT, дают вам небольшой уровень уверенности и не адресуют утечки ресурсов, кроме памяти. Если вы окажетесь в зависимости от таких инструментов, я бы сказал, что есть что-то очень, очень неправильное в вашем подходе к разработке на C++. За последние 10 лет у меня не было одной проблемы с моим кодом, связанным с утечкой памяти. Это не потому, что я - бог кодирования на C++, а потому, что я использую в своем коде основные инструменты RAII, интеллектуальных указателей и стандартных коллекций библиотек и, где возможно, избегаю явного распределения динамической памяти с помощью new. Всякий раз, когда вы оказываетесь пишете строку кода, как:

Something * p = new Something; 

стопе, и спросите себя: «Есть ли какой-нибудь способ, которым я мог бы избежать этого?» и если ответ «нет», тогда спросите себя, почему вы выделяете память необработанному указателю, и если вы не можете найти какой-либо путь вокруг этого (что очень редко бывает так, немедленно напишите код для управления указателями деблокирование и убедитесь, что этот код не является безопасным.

Если вы примете такой подход, вам не понадобятся инструменты, такие как специальные функции CRT или Valgrind, и вы сможете сэкономить океаны времени при отладке.

+0

В идеальном мире можно было бы быть чистым C++ программиста, где все структуры в программе были выполнимыми с C++ идиомы , В моем мире я переношу 10-летнюю кодовую базу Windows на Mac, написанную на ... хорошо. сочетание C, C + (странное подмножество C++, созданное людьми, которые изучили C++ после C и пишут, что по существу является C-кодом, но с некоторыми классами), C++, что все должны взаимодействовать с динамическими библиотеками lls, которые экспортируют функциональность, экспортируя C функций, C-функций, создающих интерфейсы, или просто путем экспорта классов C++. весело. –

+0

Это смехотворное заявление. Я был разработчиком в Microsoft, а _CrtCheckMemory() используется довольно широко. Основываясь на этом заявлении, я думаю, что мы сделали все неправильно в Microsoft. Проверка целостности кучи и стека помогает найти переполнение буфера, проблемы с присвоением указателей, ошибки, которые генерирует компилятор, ... Используйте Valgrind на linux или сверните свой собственный инструмент, который перехватывает выделение и выполняет вашу собственную проверку с некоторыми вид магического числа начала и конца распределения. – Byron

0

Как только подразумевается в ответ Нейла, позволяет сделать это явно:.

насколько я знаю, не существует какой-либо инструмент, который так легко доступны, как _CrtCheckMemory для GCC IIRC есть сек ome проверила библиотеки malloc там, но я не нашел их применимыми как _CrtCheckMemory. Существует, однако, Valgrind, который развернут неинтузивно и дает вам гораздо больше по всему результату.