Так что в моей программе у меня есть непрерывный массив объектов. Я делаю это потому, что хочу пространственную локализацию между каждым из этих объектов. Они действительно маленькие и находятся в очень большом массиве и перебираются по порядку.
Поэтому я инициализирую их так:
memoryPool = new Object[MAX_OBJECTS];
Это, конечно, вызывает инициализатор по умолчанию для каждого из них. объектов. Я не написал инициализатор по умолчанию И это совершенно нормально, так как они будут перезаписаны. Они не могут быть инициализированы в допустимое состояние в начале, потому что они должны быть инициализированы данными, сгенерированными позднее в будущем в разное время.
Поэтому существует переменная objectCount
, objectCount
была инициализирована с действительный инициализатор. Когда пришло время увеличить переменную objectCount
assert(newObjectCount >= objectCount);
for (int i = objectCount; i < newObjectCount; i++) {
new(&(memoryPool[i])) Object(/*Calls the valid initializer of the class*/);
}
objectCount = newObjectCount;
Этот метод, который использует новое размещение, я нашел здесь .
Итак, вы можете видеть, что я поддерживаю пространственную локальность между этими классами следующим образом.
Может быть, есть лучший способ сделать это, но я не знаю ни одного, и я все уши.
Теперь перейдем к актуальному вопросу. Этот код при запуске через valgrind с проверкой на утечку = full генерирует МНОЖЕСТВО вывода примерно Conditional jump or move depends on uninitialized value(s)
, и он всегда находится на одном из Object
объектов. Будет ли такое распределение «забавных вещей с указателями», которые могли бы испортить Memcheck?