В следующем коде:
#include <memory>
#include <iostream>
void mydeallocator(int * x) {
std::cerr << "Freeing memory" << std::endl;
delete x;
}
struct Foo {
std::unique_ptr <int,std::function <void(int*)>> x;
Foo(bool fail) : x(new int(1),mydeallocator) {
if(fail)
throw std::runtime_error("We fail here");
}
};
int main() {
{auto foo1 = Foo(false);}
{auto foo2 = Foo(true);}
}
Похоже, что память не освобождается должным образом при вызове Foo(true)
. А именно, когда мы компилируем и запускаем эту программу, мы получаем результат:
Freeing memory
terminate called after throwing an instance of 'std::runtime_error'
what(): We fail here
Aborted
Я считаю, что сообщение Freeing memory
следует вызывать дважды. В основном, в соответствии с этим question и людьми ISO С++ здесь и здесь, я понимаю, что стек должен раскрутиться над конструктором для Foo
и что x
должен вызвать его деструктор, который должен вызывать mydeallocator
, Конечно, этого не происходит, так почему память не освобождается?