Таинственное нарушение записи в моей переменной

У меня есть библиотека, которая не дает правильный вывод. Я предполагаю, что это, возможно, нарушение записи, и сфокусировал его на этом разделе кода:

void Page::build_default_frame(PosType genome_display_length)
{
Frame* frame = new Frame(*this,
margin_left,
margin_top,
width - margin_left - margin_right,
genome_display_length);
default_frame = frame;
frames.insert(default_frame);
}

default_frame это повышение intrusive_ptr<Frame>,

Прежде чем исполнить предложение default_frame = frame, содержание объекта frame было все в порядке, но после этого его содержимое было изменено до странного значения. Таким образом, я установил два наблюдения за двумя переменными frame объект:

(gdb) watch -l frame->genome_scale.genome_display_length
Hardware watchpoint 4: -location frame->genome_scale.genome_display_length
(gdb) watch -l frame->genome_scale.frame_width
Hardware watchpoint 5: -location frame->genome_scale.frame_width

а затем продолжить. Вдруг сообщает об операции записи по этим адресам:

(gdb) c
Continuing.
Hardware watchpoint 4: -location frame->genome_scale.genome_display_length

Old value = 1000
New value = 16
_dl_runtime_resolve () at ../sysdeps/x86_64/dl-trampoline.S:39
39  ../sysdeps/x86_64/dl-trampoline.S: No such file or directory.
(gdb) bt
#0  _dl_runtime_resolve () at ../sysdeps/x86_64/dl-trampoline.S:39
#1  0x00007ffff7b93dd0 in geno_eye::Page::build_default_frame (this=0x6071b0, genome_display_length=1000)
at /home/yangxi/projects/GenoEye/src/geno_eye/Page.cpp:127
#2  0x00007ffff7b93cc1 in geno_eye::Page::Page (this=0x6071b0, context=0x607750, width=300, height=300,
genome_display_length=1000) at /home/yangxi/projects/GenoEye/src/geno_eye/Page.cpp:29
#3  0x00000000004016b8 in geno_eye::__tester__::run (this=0x7fffffffe1c8)
at /home/yangxi/projects/GenoEye/t/t_page.cpp:15
#4  0x00000000004015d1 in main () at /home/yangxi/projects/GenoEye/t/t_page.cpp:36
(gdb) c
Continuing.
Hardware watchpoint 5: -location frame->genome_scale.frame_width

Old value = 240
New value = 3.1228427039313504e-317
_dl_runtime_resolve () at ../sysdeps/x86_64/dl-trampoline.S:40
40  in ../sysdeps/x86_64/dl-trampoline.S
(gdb) bt
#0  _dl_runtime_resolve () at ../sysdeps/x86_64/dl-trampoline.S:40
#1  0x00007ffff7b93dd0 in geno_eye::Page::build_default_frame (this=0x6071b0, genome_display_length=1000)
at /home/yangxi/projects/GenoEye/src/geno_eye/Page.cpp:127
#2  0x00007ffff7b93cc1 in geno_eye::Page::Page (this=0x6071b0, context=0x607750, width=300, height=300,
genome_display_length=1000) at /home/yangxi/projects/GenoEye/src/geno_eye/Page.cpp:29
#3  0x00000000004016b8 in geno_eye::__tester__::run (this=0x7fffffffe1c8)
at /home/yangxi/projects/GenoEye/t/t_page.cpp:15
#4  0x00000000004015d1 in main () at /home/yangxi/projects/GenoEye/t/t_page.cpp:36

Два старых значения являются правильными значениями для этих двух переменных-членов. Эта операция записи происходит перед выполнением = функция boost intrusive_ptr, так как я нажал десятки «дальше», а код все еще находится в файле ДЛ-trampoline.S.

(gdb) n
41  in ../sysdeps/x86_64/dl-trampoline.S
(gdb) n
42  in ../sysdeps/x86_64/dl-trampoline.S
(gdb) n
43  in ../sysdeps/x86_64/dl-trampoline.S
(gdb) n
44  in ../sysdeps/x86_64/dl-trampoline.S
(gdb) n
45  in ../sysdeps/x86_64/dl-trampoline.S
(gdb) n
46  in ../sysdeps/x86_64/dl-trampoline.S
(gdb) n
47  in ../sysdeps/x86_64/dl-trampoline.S
(gdb) n
48  in ../sysdeps/x86_64/dl-trampoline.S
(gdb) n
49  in ../sysdeps/x86_64/dl-trampoline.S
(gdb) n
50  in ../sysdeps/x86_64/dl-trampoline.S
(gdb) n
51  in ../sysdeps/x86_64/dl-trampoline.S
(gdb) n
52  in ../sysdeps/x86_64/dl-trampoline.S
(gdb) n
53  in ../sysdeps/x86_64/dl-trampoline.S
(gdb) n
54  in ../sysdeps/x86_64/dl-trampoline.S
(gdb) n
56  in ../sysdeps/x86_64/dl-trampoline.S
(gdb) n
boost::intrusive_ptr<geno_eye::Frame>::operator= (this=0x6071b0, rhs=0x3e8)
at /usr/include/boost/smart_ptr/intrusive_ptr.hpp:134
134     {

Что такое ДЛ-trampoline.S ? Почему молча пишут на память моего объекта?

Кроме того, я также запускаю valgrind:

$ valgrind ./t_page

Однако вместо недопустимой записи он сообщает о недопустимом чтении этого объекта, что происходит после завершения создания объекта.

0

Решение

Это вызвано ошибкой ссылки на стек.

объект genome_scale содержит две ссылки на две переменные-члены frame объект. Когда я реконструирую свой код, он случайно ссылается на две переменные стека …

Поэтому, возможно, мне следует избегать использования ссылочных типов в этой ситуации, так как вы можете легко предоставлять им стековые материалы и не получать никаких предупреждений.

1

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