2013-04-22 5 views
0

EDIT: Для большей ясности я оставлю вопрос таким, какой он есть. Проблема состоит в том, что класс Kameleon использует boost, а с мой собственный код также использует его, вероятно, конфликтующие версии и , из-за чего возникают проблемы.Утверждение sYSMALLOc не удалось при использовании ключевого слова «новое»

Оригинальный вопрос:

Лота информации, но я пытался варить до интересных деталей. Я пишу приложение, которое использует экземпляры класса Kameleon (который я сам не писал) для выполнения различных задач. Когда я пытаюсь использовать ключевое слово new для выделения экземпляра, я сталкиваюсь с проблемой. Вот уменьшенная версия задачи:

#include <ccmc/Kameleon.h> 

int main() { 
    ccmc::Kameleon k; 
    ccmc::Kameleon *k2 = new ccmc::Kameleon(); // <-- crashes with this line 
    delete k2: 
    return 0; 
} 

SIDE ПРИМЕЧАНИЕ: закомментировав new распределение k2 и только работает ccmc::Kameleon k работы, и я могу использовать переменную. Тем не менее, программа segfaults, когда main() возвращается, когда я пытаюсь это сделать. Деструктор ничего не делает.

Параметр `Kameleon конструктор выполняет следующие действия:

// Kameleon.cpp 
/*47*/ Kameleon::Kameleon() : model(NULL), // model is a non-const pointer 
/*48*/      modelName("NA"), // modelName is a non-const std::string 
/*49*/      missingValue(0.f) // missingValue is a non-const float 
/*50*/ {} 

Я попытался мои проблемы с сообщениями об ошибках, GDB и Valgrind, но не могу показаться, чтобы найти источник. Это то, что работает программа дает мне:

FurnaceApp: malloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed. 
Aborted (core dumped) 

GDB говорит мне следующее:

(gdb) bt 
#0 0x00007ffff6b1c425 in __GI_raise (sig=<optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64 
#1 0x00007ffff6b1fb8b in __GI_abort() at abort.c:91 
#2 0x00007ffff6b6415d in __malloc_assert (assertion=<optimized out>, file=<optimized out>, line=<optimized out>, function=<optimized out>) 
    at malloc.c:300 
#3 0x00007ffff6b67664 in sYSMALLOc (av=0x7ffff6e9e720, nb=48) at malloc.c:2448 
#4 _int_malloc (av=0x7ffff6e9e720, bytes=27) at malloc.c:3892 
#5 0x00007ffff6b68fb5 in __GI___libc_malloc (bytes=27) at malloc.c:2924 
#6 0x00007ffff746cded in operator new(unsigned long)() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#7 0x00007ffff7455a89 in std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&)() 
    from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#8 0x00007ffff7457495 in char* std::string::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag)() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#9 0x00007ffff74575e3 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#10 0x00007ffff7757caf in ccmc::Kameleon::Kameleon (this=0x67d920) at Kameleon.cpp:49 
#11 0x0000000000415516 in main() 

Тогда, наконец, Valgrind дает мне много продукции, но этот раздел выглядит наиболее, как и предыдущие ошибки:

==11789== Invalid write of size 8 
==11789== at 0x52ECC8D: ccmc::Kameleon::Kameleon() (buckets.hpp:128) 
==11789== by 0x415515: main (in /home/vsand/OpenSpace/Furnace/FurnaceApp) 
==11789== Address 0x6683a00 is 0 bytes after a block of size 464 alloc'd 
==11789== at 0x4C2B1C7: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==11789== by 0x41550A: main (in /home/vsand/OpenSpace/Furnace/FurnaceApp) 
==11789== 
==11789== Invalid write of size 8 
==11789== at 0x52ECC94: ccmc::Kameleon::Kameleon() (table.hpp:226) 
==11789== by 0x415515: main (in /home/vsand/OpenSpace/Furnace/FurnaceApp) 
==11789== Address 0x6683a28 is not stack'd, malloc'd or (recently) free'd 
==11789== 
==11789== Invalid write of size 8 
==11789== at 0x52ECC9F: ccmc::Kameleon::Kameleon() (Kameleon.cpp:49) 
==11789== by 0x415515: main (in /home/vsand/OpenSpace/Furnace/FurnaceApp) 
==11789== Address 0x6683a30 is not stack'd, malloc'd or (recently) free'd 
==11789== 

Оглядевшись здесь и там, кажется, как эти ошибки обычно появляются при использовании malloc неправильно и записи за выделенную память и т.д. существует много с ode в классах Kameleon, но так как я сам не писал, у меня проблемы с поиском. Любые советы по поиску ошибок будут очень оценены!

+0

Я бы рискнул предположить, что ошибка находится в '// Другие инициализации' – john

+0

@john: я удалил ненужные части из кода и обновил вопрос. –

ответ

1
==11789== Invalid write of size 8 
==11789== at 0x52ECC8D: ccmc::Kameleon::Kameleon() (buckets.hpp:128) 
==11789== by 0x415515: main (in /home/vsand/OpenSpace/Furnace/FurnaceApp) 
==11789== Address 0x6683a00 is 0 bytes after a block of size 464 alloc'd 
==11789== at 0x4C2B1C7: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==11789== by 0x41550A: main (in /home/vsand/OpenSpace/Furnace/FurnaceApp) 

Это означает, что:

  • ваш код, который выделяет экземпляр ccmc::Kameleon считает, что sizeof(ccmc::Kameleon) 464, в то время как
  • код, который фактически реализует ccmc::Kameleon::Kameleon() пишет байт [this+464, this+472).

Наиболее вероятной причиной:

  • вы изменили определение класса в buckets.hpp и
  • вы не перекомпилировать все код, который использует его, тем самым нарушив one definition rule.

Вы должны восстановить все код, который использует Kameleon, и как только вы делаете, ваши проблемы исчезнут.

buckets.hpp от наддува заголовков

Другой возможность заключается в том, что вы связываете с библиотекой, которая была составлена ​​против другой версии Boost. Это не может работать, вы есть использовать ту же самую версию Boost.

Последняя возможность заключается в том, что Boost скомпонован с несогласованным набором флагов -DXX, что приводит к различным определениям класса Kameleon (и снова нарушает одно правило определения).

+0

Спасибо, я на нем. Похоже, что и buckets.hpp, и table.hpp (и больше файлов с ошибкой, подобной им) - из заголовков boost. –

+0

Видел ваше обновление о повышении сразу после того, как я сам его комментировал. После большего копания кажется, что Kameleon действительно использует boost, и это, вероятно, из-за проблемы. Я соглашусь с этим ответом и попытаюсь решить конфликт с ударом! –

1

Вы можете попробовать:

Kameleon::Kameleon(): model(NULL), modelName("N/A") { 
    // ... 
} 

modelName ли Const случайно?

Можете ли вы удалить весь код неполного кода в конструкторе CDFReader, чтобы изолировать ошибку? Или еще лучше:

#include "Kameleon.h" // or whatever 

int main(){ 
    ccmc::Kameleon k; 
    ccmc::Kameleon *k2 = new ccmc::Kameleon(); 
    delete k2; 
} 

Kameleon - производный класс? Перегружает ли оператор new?

+0

Спасибо, я пересмотрел вопрос и модифицировал конструктор. Он по-прежнему падает, но с небольшими ошибками! –

+0

@VictorSand: Какой вызов терпит неудачу? и то и другое? попробуйте комментировать второй. Перегружает ли этот класс оператор 'new'? – Thibaut

+0

При запуске 'ccmc :: Kameleon k 'я не получаю те же ошибки. Я могу использовать переменную сразу после ее создания. Однако, когда main() возвращает, я получаю segfault, который я не могу отслеживать. Я проверил деструктор Камелеона, там ничего не кажется странным. Может ли это быть связано с проблемами при использовании новых? –