EXC_BAD_ACCESS при неожиданном уничтожении статического объявления std :: vector & lt; double & gt;

Я немного озадачен этим … Моя программа падает при определенных обстоятельствах. Судя по следам стека, похоже, что проблема возникает при уничтожении статически выделенного std::vector<double> тип. Самый нижний кадр в стеке содержит указатель на первое значение в векторе. Я приложил стек кадров и соответствующий код, чтобы помочь с отладкой. Вот что я нашел до сих пор:

  1. Похоже, что плохой доступ происходит при освобождении статически распределенного std::vector<double>

  2. Я передаю значения по ссылке здесь, и кажется, что вектор неявно освобождается при более раннем вызове, но сейчас это просто проблема (не уверен)

Вот рамка & код:

#0  0x00007fff8b83a19a in tiny_free_list_remove_ptr ()
#1  0x00007fff8b835fa1 in szone_free_definite_size ()
#2  0x0000000100003e70 in __gnu_cxx::new_allocator<double>::deallocate(double*, unsigned long) at /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/include/c++/4.2.1/ext/new_allocator.h:97
#3  0x0000000100003dce in std::_Vector_base<double, std::allocator<double> >::_M_deallocate(double*, unsigned long) at /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/include/c++/4.2.1/bits/stl_vector.h:137
#4  0x0000000100003d5c in std::_Vector_base<double, std::allocator<double> >::~_Vector_base() at /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/include/c++/4.2.1/bits/stl_vector.h:123
#5  0x0000000100005d9c in std::vector<double, std::allocator<double> >::~vector() at /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/include/c++/4.2.1/bits/stl_vector.h:272
#6  0x0000000100003655 in std::vector<double, std::allocator<double> >::~vector() at /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/include/c++/4.2.1/bits/stl_vector.h:271
#7  0x0000000100008c87 in tExplore::printStatsHeader(std::vector<transaction*, std::allocator<transaction*> >&) at /Users/blah/Dropbox/Code/Transactulator/tExplore.cpp:284
#8  0x00000001000080d7 in tExplore::stats(std::vector<transaction*, std::allocator<transaction*> >&) at /Users/blah/Dropbox/Code/Transactulator/tExplore.cpp:298
#9  0x0000000100006ab5 in tExplore::menu(std::vector<std::pair<std::string, std::vector<transaction*, std::allocator<transaction*> > (*)()>, std::allocator<std::pair<std::string, std::vector<transaction*, std::allocator<transaction*> > (*)()> > >, void (*)(std::vector<transaction*, std::allocator<transaction*> >&)) at /Users/blah/Dropbox/Code/Transactulator/tExplore.cpp:119
#10 0x0000000100006de0 in tExplore::start(tdata*) at /Users/blah/Dropbox/Code/Transactulator/tExplore.cpp:147

кадр 2:

      // __p is not permitted to be a null pointer.
void
deallocate(pointer __p, size_type)
{ ::operator delete(__p); }           <—- EXC_BAD_ACCESS= 0x1000000008

значения кадра 2:

this    __gnu_cxx::new_allocator<double> *  0x7fff5fbff598  0x00007fff5fbff598
__p     __gnu_cxx::new_allocator<double>::pointer   0x1005004d0 0x00000001005004d0
*__p    double   -20.96999931335449   -20.96999931335449

кадр 3:

      void
_M_deallocate(_Tp* __p, size_t __n)
{
if (__p)
_M_impl.deallocate(__p, __n);         <—- EXC_BAD_ACCESS= 0x1000000008

кадр 4:

      ~_Vector_base()
{ _M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage
- this->_M_impl._M_start); }      <—- EXC_BAD_ACCESS= 0x1000000008

кадр 5 & 6:

      ~vector()
{ std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
_M_get_Tp_allocator()); }         <—- EXC_BAD_ACCESS= 0x1000000008

кадр 7:

void tExplore::printStatsHeader(tvec& data)
{
size_t total = data.size();
double amt_sum;
...
double amt_tmp;
std::vector<double> amt_vec;

//for (tvec::iterator it = data.begin(); it != data.end(); ++it) {
//    amt_tmp = (*it)->getAmount();
//    amt_vec.push_back(amt_tmp);
//}
for (int i = 0; i < total; i++) {
amt_tmp = data.at(i)->getAmount();
amt_vec.push_back(amt_tmp);
}

amt_sum = sstats::sum(amt_vec);
...
amt_min = sstats::min(amt_vec);

clear();
std::cout << "Summary Statistics..." << endl;
...
std::cout << "\tMin:      $" << std::fixed << std::setprecision(2) << amt_min    << endl;
}                               <—- EXC_BAD_ACCESS= 0x1000000008

кадр 8:

void tExplore::stats(tvec& v)
{
menuObj mObj;
int tmp; /* tmp */

mObj.push_back(make_pair(std::string(MENU_HEADER), nullptr));
....
mObj.push_back(make_pair("6. Remove via date query", nullptr));
printStatsHeader(v);       <—- EXC_BAD_ACCESS= 0x1000000008
printMenu(mObj, false);

0

Решение

Спасибо, Турикс,

Я смог решить мою проблему, включив охрану malloc. Я не знал, что это такое, и нашел эту документацию довольно полезной:

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/libgmalloc.3.html

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

Спасибо!

0

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

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

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