#define导致“访问冲突读取位置”

时间:2013-11-05 10:06:44

标签: c++

我认为这是儿童问题,但我找不到如何解决它的信息。

// * H:

class Foo
{
    #if defined(RedefChallangesCount)
        static const mainDataType ChallangesCount = 500;
        #undef RedefChallangesCount
    #else
        static const mainDataType ChallangesCount = 1;
    #endif

    ...
    int _correctAnswers[ChallangesCount];

    ....
}

在我的VS测试课程中:

#include "stdafx.h"
#include "CppUnitTest.h"
#define RedefChallangesCount
#include "..\Core\ChallengeManager.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;
using namespace Brans;

namespace CoreTests
{
    TEST_CLASS(SomeTestClass)
    {
    public:
        TEST_METHOD(SomeTestMethod)
        {
            Foo* cm = new Foo();
            cm->Method();
            ...
            delete cm;
        }
    }
}

在我看来,我在docs中都喜欢这样,但是当用#define RedefChallangesCount行运行测试时,我得到了一些奇怪的错误,例如“访问冲突读取位置”,有时候数组不好 _正确答案。与此同时,我发现ChallangesCount是预期的500。如果我评论#define RedefChallangesCount行 - 所有错误都消失了...... 什么可能是错的?

2 个答案:

答案 0 :(得分:4)

您的#undef让我怀疑此标题是否包含在其他位置(例如ChallengeManager.cpp,这意味着您的_correctAnswers大小为500在某些地方和1在其他地方,这肯定会解释你的崩溃。

(编辑):您的测试是否是解决方案中的单独项目,主代码位于自己的项目中,或者您的代码是否直接在测试项目中编译?

为了安全起见,在VS构建配置中设置#define(对于链接到测试的所有项目 - 您需要为此添加测试构建配置,并使用它而不是调试/发布对于测试版本而不是在代码中定义它,并删除#undef

答案 1 :(得分:1)

我倾向于在代码中没有if defined个部分,尤其是类代码。我倾向于使用变量,并根据其值进行分支:

测试类中的

删除#define RedefChallangesCount并替换为bool RedefChallangesCount的全局变量

然后您的代码变得更加简单,可以如下(出于演示目的的简化版本):

#include <iostream>

using namespace std;
bool RedefChallangesCount = false;
int main()
{
    int ChallangesCount;
    cout << RedefChallangesCount << endl;
    if (RedefChallangesCount)
        ChallangesCount = 500;
    else
        ChallangesCount = 1;

   cout << ChallangesCount << endl; 

   return 0;
}

而不是:

#if defined(RedefChallangesCount)
    static const mainDataType ChallangesCount = 500;
    #undef RedefChallangesCount
#else
    static const mainDataType ChallangesCount = 1;
#endif

但是,让我知道是否需要使用预处理器,然后我可以尝试使用该方法为您排序解决方案,尽管如我所说,我不使用预处理程序指令来实际程序流程(必须添加< em>通常,保证我已经做了一次因为有效的原因,并且无法记住)。