История у меня есть пара SEGFAULT
s — поэтому я протестировал свою программу с Dr. Memory и получил тонны сообщений об утечке памяти с использованием конструктора по умолчанию следующего класса:
struct Colour {
Colour()
: value (0) {} /** LINE 7 **/
Colour (l_uint8 r, l_uint8 g, l_uint8 b)
: value (r << L_RED_SHIFT | g << L_GREEN_SHIFT | b << L_BLUE_SHIFT) {}
Colour (l_uint32 val)
: value (val) {}
l_uint32 value;
l_uint8 r() { return value >> L_RED_SHIFT & 255; }
l_uint8 g() { return value >> L_GREEN_SHIFT & 255; }
l_uint8 b() { return value >> L_BLUE_SHIFT & 255; }
void r (l_uint8 val) { value = (value & 0x00ffffff) | (val << L_RED_SHIFT); }
void g (l_uint8 val) { value = (value & 0xff00ffff) | (val << L_GREEN_SHIFT); }
void b (l_uint8 val) { value = (value & 0xffff00ff) | (val << L_BLUE_SHIFT); }
};
Что может быть не так с этим ?!
Образцы из резюме доктора Мемори:
Сначала идут такие предупреждения:
Error #3: UNADDRESSABLE ACCESS beyond heap bounds: reading 0x0250090e-0x02500910 2 byte(s) within 0x02500900-0x02500910
# 0 nvd3d9wrap.dll!setDeviceHandle +0x1710 (0x732ea060 <nvd3d9wrap.dll+0xa060>)
# 1 nvd3d9wrap.dll!CheckDXGIModule +0x44f (0x732e28a0 <nvd3d9wrap.dll+0x28a0>)
# 2 nvd3d9wrap.dll!GetNVDisplayW +0x1b24 (0x732e4595 <nvd3d9wrap.dll+0x4595>)
# 3 __gcc_register_frame [../OOP_Proj_W_Text_Rectification/colour.hpp:7]
# 4 register_frame_ctor [../../../../../src/gcc-4.8.0/libgcc/config/i386/cygwin.S:184]
# 5 __tmainCRTStartup [../OOP_Proj_W_Text_Rectification/colour.hpp:7]
# 6 KERNEL32.dll!BaseThreadInitThunk +0x11 (0x777533aa <KERNEL32.dll+0x133aa>)
Note: @0:00:00.286 in thread 6876
Note: refers to 0 byte(s) beyond last valid byte in prior malloc
Note: prev lower malloc: 0x025008e8-0x0250090e
Note: instruction: movdqu (%edx) -> %xmm1
Тогда утечка сообщений:
Error #66: LEAK 188 direct bytes 0x031e00f8-0x031e01b4 + 0 indirect bytes
# 0 replace_operator_new [d:\drmemory_package\common\alloc_replace.c:2609]
# 1 testing::Message::Message [../../../mingw48_32/lib/gcc/i686-w64-mingw32/4.8.0/include/c++/googletest/src/gtest.cc:946]
# 2 testing::internal::FlagToEnvVar [../../../mingw48_32/lib/gcc/i686-w64-mingw32/4.8.0/include/c++/googletest/src/gtest-port.cc:1118]
# 3 testing::internal::BoolFromGTestEnv [../../../mingw48_32/lib/gcc/i686-w64-mingw32/4.8.0/include/c++/googletest/src/gtest-port.cc:1177]
# 4 __static_initialization_and_destruction_0 [../../../mingw48_32/lib/gcc/i686-w64-mingw32/4.8.0/include/c++/googletest/src/gtest.cc:202]
# 5 _GLOBAL__sub_I__ZN7testing8internal17kStackTraceMarkerE [../../../mingw48_32/lib/gcc/i686-w64-mingw32/4.8.0/include/c++/googletest/src/gtest-typed-test.cc:118]
# 6 __tmainCRTStartup [../OOP_Proj_W_Text_Rectification/colour.hpp:7]
# 7 KERNEL32.dll!BaseThreadInitThunk +0x11 (0x777533aa <KERNEL32.dll+0x133aa>)
UPD: использование структуры
1) в качестве возвращаемого значения
Colour Image::getPixel (size_t x, size_t y) const {
Colour c;
pixGetPixel (data, x, y, &(c.value)); // A method from Leptonica
return c;
}
2) В качестве аргумента метода const reference
3) в качестве хранилища для возвращаемого значения функции
Colour c = getPixel (x, y)
Задача ещё не решена.
Других решений пока нет …