Войти
ПрограммированиеФорумОбщее

C++/variadic templates/std::tuple

#0
15:52, 9 авг. 2018

Собсна, сабж. Дан некий условный класс буфера(UniformBuffer), он реализует(по-крайней мере должен где-то там в задумках) SoA путь хранения данных. Внутри буфера std::tuple, который есть кортеж AlignedBuffer<какой-нибудь-тип>(раньше Uniform & Aligned были одним классом, но столкнувшись с нижеописанной проблемой я попробовал его разделить на два, не взлетело). Инициализируется кортеж в конструкторе как-то так

UniformBuffer(int64_t length)
    : data(impl::AlignedBuffer<DataTypes>(length)...)
{}
и вроде даже собирается, память внутри AlignedBuffer выделяется, только вот не освобождется в конце. В этом проблема. Если собрать тестовое приложение(код ниже), то вывод в консоль будет примерно таким
allocated block(i) 93824992337520
allocated block(f) 93824992341824
allocated block(f) 93824992342016
free invoked(f) for 93824992342016
free invoked(f) for 93824992342016
free invoked(f) for 93824992342016
free invoked(f) for 93824992342016
free invoked(f) for 93824992342016
free invoked(f) for 93824992342016
free invoked(f) for 93824992342016
free invoked(f) for 93824992342016
free invoked(f) for 93824992342016
free invoked(f) for 93824992342016
free invoked(f) for 93824992342016
... и так до бесконечности, пока сегфолт не выскочит.
То есть метод освобождения памяти вызывается дохреналион раз, и всё на одном блоке. Вопрос, что я делаю не так? gcc (Debian 7.3.0-27) 7.3.0

+ весь код

#1
17:39, 9 авг. 2018
    static void free(DataType *mblock)
    {
        free(mblock);
    }
Угадай с одного раза, какой из free вызовется на этой строке.
#2
20:32, 9 авг. 2018

Delfigamer
> Угадай с одного раза, какой из free вызовется на этой строке.
Чьорт, слона то я и не приметил ^_^ спасибо.

ПрограммированиеФорумОбщее