Что не так с этим кодом и как его исправить?Почему этот явный деструктор вызывает повреждение памяти в общем ptr?
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <vector>
struct CTest
{
CTest()
{ std::cout << "ctor CTest" <<std::endl; }
~CTest()
{ std::cout << "dtor CTest" <<std::endl; }
};
struct CSlot
{
CSlot() : m_test(new CTest()), m_num(123)
{ }
~CSlot()
{
// m_test.reset(); // this line fixed the code but I don't know why
m_num = -1;
}
boost::shared_ptr<CTest> m_test;
int m_num;
};
int main()
{
std::vector<CSlot> testVector(1);
std::cout << "1" << std::endl;
new (&testVector[0]) CSlot();
// clear slot
testVector[0].~CSlot();
std::cout << "2" << std::endl;
}
этот код выглядит как работает, и печатает:
ctor CTest
1
ctor CTest
dtor CTest
2
но иногда падение программы и Valgrind всегда говорит:
==13372== Invalid read of size 4
==13372== at 0x400D8F: boost::detail::atomic_exchange_and_add(int*, int)
...
я могу исправить это поведение с m_test.reset(), но я думаю, что есть более правильное решение ...
Я хочу создать несколько слотов со значениями по умолчанию и позже инициализировать с помощью места размещения новым, а иногда и сбросить с явным деструктором ... Может быть, мне нужен другой конструктор для shared_ptr –
«Если вы хотите использовать новое место размещения и вызвать деструктор прямо, вы должны сделать это в пустой буфер символов. " Не совсем. Вы должны использовать правильно выровненную необработанную память. Но буфер символов в порядке, если вы убедитесь, что он правильно выровнен. –
@SergeDundich: Я пытался сохранить его простым, и char [] является наиболее распространенным способом сделать это. ;) – jalf