1

故事是我有几个SEGFAULTs - 所以我用 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); }
};

它有什么问题?!

来自 Dr.Memory 总结的样本:
首先出现这样的警告:

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 引用方法参数

3) 作为函数返回值的存储

Colour c = getPixel (x, y)
4

0 回答 0