2016-11-23 26 views
1

私はGoogle Test and Mockフレームワークの初心者です。Google Mockでダブルフリー

私はちょうど "タートル"の例を実行しようとすると、それは成功しました。

ただし、エラーメッセージが表示されました:ダブルフリーまたは破損(!prev)。

MockTurtle.h

#include <gmock/gmock.h> 

class MockTurtle : class Turtle { 
    MOCK_METHOD0(PenUp, void()); 
    MOCK_METHOD0(PenDown, void()); 
    MOCK_METHOD1(Forward, void(int distance)); 
    MOCK_METHOD1(Turn, void(int degrees)); 
    MOCK_METHOD2(GoTo, void(int x, int y)); 
    MOCK_CONST_METHOD0(GetX, int()); 
    MOCK_CONST_METHOD0(GetY, int()); 
};  

Turtle.h

class Turtle { 
    virtual ~Turtle() {} 
    virtual void PenUp() = 0; 
    virtual void PenDown() = 0; 
    virtual void Forward(int distance) = 0; 
    virtual void Turn(int degrees) = 0; 
    virtual void GoTo(int x, int y) = 0; 
    virtual int GetX() const = 0; 
    virtual int GetY() const = 0; 
};  

Painter.h

class Painter  
{ 
       Turtle* turtle; 
public: 
       Painter(Turtle* turtle) 
               :       turtle(turtle){} 

       bool DrawCircle(int, int, int){ 
               turtle->PenDown(); 
               return true; 
       } 
};     

Main_test.cpp

#include <gtest/gtest.h> 
#include <gmock/gmock.h> 
#include "Painter.h" 
#include "MockTurtle.h" 

using ::testing::AtLeast; 

TEST(PainterTest, CanDrawSomething) { 
 MockTurtle turtle; 
 EXPECT_CALL(turtle, PenDown()) 
     .Times(AtLeast(1)); 

 Painter painter(&turtle); 

 EXPECT_TRUE(painter.DrawCircle(0, 0, 10)); 
} 

int main(int argc, char** argv) { 
 // The following line must be executed to initialize Google Mock 
 // (and Google Test) before running the tests. 
 ::testing::InitGoogleMock(&argc, argv); 
 return RUN_ALL_TESTS(); 
}     

結果

[==========] Running 1 test from 1 test case.  
[----------] Global test environment set-up. 
[----------] 1 test from PainterTest 
[ RUN      ] PainterTest.CanDrawSomething 
[       OK ] PainterTest.CanDrawSomething (0 ms) 
[----------] 1 test from PainterTest (0 ms total) 
[----------] Global test environment tear-down 
[==========] 1 test from 1 test case ran. (1 ms total) 
[  PASSED  ] 1 test. 
*** Error in `/home/user/workspace/google_mock_2/Debug/google_mock_2': double free or corruption (!prev): 0x098a8080 *** 

私はいくつかの同じ問題を見て、グーグルしてみました。人々は、グローバル変数としてモックを使うべきではないと言いました。

しかし、私の例ではグローバル変数は使用されませんでした。

ダブルフリーの理由を説明してください。 ありがとうございます!

+0

すでにソースコードを追加しています。それは私の例ではすべてです。 – quangdien

答えて

0

前回、GoogleテストとGoogleモックをSHAREDライブラリに作成しました。 エラー(ダブルフリー)が発生しました。

私はSTATICライブラリとして構築しようとしました。このエラーは表示されなくなりました。 私は理由を知らないが、詳細を知るために調査する。

0

あなたのエラーはあなたが私たちに表示されないところです。私はコンパイルするために例を取得するのに十分なヘッダや定義を追加するために管理:

#include <gtest/gtest.h> 
#include <gmock/gmock.h> 

class Turtle { 
public: 
    virtual ~Turtle() = default; 
    virtual void PenDown() = 0; 
}; 

class MockTurtle : public Turtle { 
public: 
    MOCK_METHOD0(PenDown, void()); 
}; 


class Painter 
{ 
    Turtle *turtle; 

public: 
    Painter(Turtle *turtle) 
     : turtle(turtle) 
    {} 

    bool DrawCircle(int, int, int) 
    { 
     turtle->PenDown(); 
     return true; 
    } 
}; 

TEST(PainterTest, CanDrawSomething) 
{ 
    MockTurtle turtle; 
    EXPECT_CALL(turtle, PenDown()).Times(testing::AtLeast(1)); 

    Painter painter(&turtle); 
    EXPECT_TRUE(painter.DrawCircle(0, 0, 10)); 
} 

このメイクファイルを使用して:

VPATH += $(GTEST_DIR)/src 
VPATH += $(GMOCK_DIR)/src 
gtest%.o: CPPFLAGS += -I$(GTEST_DIR) 
gmock%.o: CPPFLAGS += -I$(GMOCK_DIR) 

40762798: CXXFLAGS += -isystem $(GTEST_DIR)/include -isystem $(GMOCK_DIR) 
40762798: CXXFLAGS += -pthread -Wno-effc++ 
40762798: LDLIBS += -lpthread 
40762798: CC=g++ 
40762798: 40762798.o gtest_main.o gtest-all.o gmock-all.o 

その後、私はエラーを取得していない、とValgrindのは健康のクリーン法案与える:

valgrind ./40762798 
==24351== Memcheck, a memory error detector 
==24351== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. 
==24351== Using Valgrind-3.12.0.SVN and LibVEX; rerun with -h for copyright info 
==24351== Command: ./40762798 
==24351== 
Running main() from gtest_main.cc 
[==========] Running 1 test from 1 test case. 
[----------] Global test environment set-up. 
[----------] 1 test from PainterTest 
[ RUN  ] PainterTest.CanDrawSomething 
[  OK ] PainterTest.CanDrawSomething (84 ms) 
[----------] 1 test from PainterTest (92 ms total) 

[----------] Global test environment tear-down 
[==========] 1 test from 1 test case ran. (125 ms total) 
[ PASSED ] 1 test. 
==24351== 
==24351== HEAP SUMMARY: 
==24351==  in use at exit: 0 bytes in 0 blocks 
==24351== total heap usage: 183 allocs, 183 frees, 117,387 bytes allocated 
==24351== 
==24351== All heap blocks were freed -- no leaks are possible 
==24351== 
==24351== For counts of detected and suppressed errors, rerun with: -v 
==24351== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 
+0

Eclipseを使用して私の例を構築します。この例を作るためにmakefileを使うつもりです。 – quangdien

0

私は同じ問題がありました。私の場合、問題はGoogleテストとGoogleモックの両方をリンクすることでした。私はgmock、gtestをリンクするだけで問題を解決しました。

これはgmockが既に静的なgtestにリンクしているからです:gmockを動的ライブラリとしてコンパイルすると、gmockが構築されているのと同じフォルダに(静的ライブラリとして)gtestも生成されます。私はgmockがこのライブラリに依存し、使用していると思います。

何らかの形で、gtestを2回(静的および動的に)リンクすると、2回実行されるfree()が生成されると仮定します。

関連する問題