Отчетность Valgrind Несоответствие free () / delete / delete []

Я пишу библиотеку, которая будет работать на нескольких системах (некоторые из которых не имеют malloc или stdlib). В моем stdlib (другой lib) я переопределяю new а также delete операторы для выполнения общих вызовов функций (в этом примере нет этих функций). Каждая система будет переопределять эти общие вызовы для своих соответствующих устройств выделения памяти.

Проблема в том, когда я пытаюсь это сделать. Вот несколько урезанных примеров кода, чтобы воспроизвести проблему:

#include <cstdlib>

void* operator new(unsigned long size) {
return std::malloc(size); // would normally call an intermediate function which would be overridden by the system
}

void operator delete(void* object) {
std::free(object); // would normally call an intermediate function which would be overridden by the system
}
void operator delete(void* object, unsigned long size) {
std::free(object); // would normally call an intermediate function which would be overridden by the system
}

class MyClass {

};

int main() {
MyClass* myClass = new MyClass();
delete myClass;
}

Когда я строю это с равниной gcc-6 (без аргументов) и беги с valgrind (без аргументов), я получаю эту ошибку:

==11219== Mismatched free() / delete / delete []
==11219==    at 0x4C2DD6B: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11219==    by 0x108730: operator delete(void*, unsigned long) (in /home/chris13524/tmp/test.o)
==11219==    by 0x10875A: main (in /home/chris13524/tmp/test.o)
==11219==  Address 0x5200040 is 0 bytes inside a block of size 1 alloc'd
==11219==    at 0x4C2D1AF: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11219==    by 0x108745: main (in /home/chris13524/tmp/test.o)

Похоже, delete оператор работает правильно, но Valgrind переопределяет мой переопределенный new оператор. Есть идеи, как это исправить?

Удаление промежуточных функций не вариант, так как у меня есть другой код там.

Пример того, как это работает в моей реальной программе (опять же, не показано в моем примере):

new => create => <intermediate code> => createImpl => malloc
create => <intermediate code> => createImpl => malloc

Я использую gcc v6.2.0, valgrind v3.12.0 и Ubuntu 16.10.

8

Решение

Благодаря Полу Флойду, эта ошибка была исправлена ​​в коммите 6ef6f738a. Смотрите отчет об ошибке Вот.

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]