怀疑函数指针数组的声明

时间:2013-03-01 20:11:28

标签: c++ visual-studio-2010 pointers

我已经设法使用此代码创建“指向成员函数数组”,并且它工作正常......

typedef string (MyReportHelper::*reportFunctions)();
MyReportHelper helper;

void internalPointersTest(){
    reportFunctions reportFunArray[] = {
        &MyReportHelper::getVersion,
        &MyReportHelper::getModel,
        &MyReportHelper::getUsername,
    };
    int arrSize = sizeof(reportFunArray)/sizeof(reportFunArray[0]);

    for(int i = 0; i < arrSize; i++){
        string result = (helper.*reportFunArray[i])();
        printf("%s", result);
    }
}

但是,如果我将数组声明放在我的函数之外,就像下面的代码一样,我在Visual Studio中得到缓冲区溢出访问冲突,但代码编译

typedef string (MyReportHelper::*reportFunctions)();
MyReportHelper helper;

reportFunctions reportFunArray[] = 
{
    &MyReportHelper::getVersion,
    &MyReportHelper::getModel,
    &MyReportHelper::getUsername,
};

void internalPointersTest(){
    int arrSize = sizeof(reportFunArray)/sizeof(reportFunArray[0]);

    for(int i = 0; i < arrSize; i++)
    {
        //next line will fail
        string result = (helper.*reportFunArray[i])();
        printf("%s", result);
    }
}

有谁知道如何解释为什么我需要将其保留在功能范围内?

2 个答案:

答案 0 :(得分:2)

您没有使用i索引数组。

其次,使用std::beginstd::end,他们已经为您处理了这个错误。

最后,PTMF基本上一文不值。使用std::function

编辑:

可能发生的事情是你翘起尺寸计算而VS恰好注意它是静止的。它在两个版本中都可能同样被打破。那是你的UB。

再次编辑:您将string类型的对象传递给printf?如果那个不是 const char*的typedef,那么你好UB。如果它 ...那么owch,这真的很糟糕。

答案 1 :(得分:0)

string result = (helper.*reportFunArray[i])();
printf("%s", result);

我认为string实际上是std::string?你在using namespace std;某个地方吗?

在这种情况下,printf("%s", result);很可能会崩溃,因为它会解释上帝知道什么是C风格字符串的第一个字符。以下是否有效?

string result = (helper.*reportFunArray[i])();
std::cout << result;