多次执行同一程序时的未定义行为

时间:2011-11-04 01:16:05

标签: c++ visual-studio-2010

当我在VS2010中的Release中编译相同的程序时,我得到了一个奇怪的行为。如果我多次从cmd.exe运行程序,结果会变得乱七八糟。但是,如果我在Debug中运行程序,结果总是一样的。

启动新的命令提示符会使程序再次发出正确的输出。

有什么可能导致这种情况的想法吗?

Screenshot of the command prompt

编辑:代码:

int main(int argc, char* argv[])
{
    int* R;
    int capacity;

    if (argc < 2)
    {
        cerr << "Veuillez entrer le chemin du fichier d'entree" << endl;
        return 1;
    }

    vector<BTS> stations;
    LoadFromFile(argv[1], stations, capacity);

    int count = 1;
    if (argc == 3)
    {
        count = atoi(argv[2]);
    }

    clock_t startClock = clock();

    R = new int[capacity+1];
    for(int j = 0; j < count; j++)
    {
        memset(R, 0, capacity + 1);

        for(unsigned int i=0; i < stations.size(); i++)
        {
            for(int j=capacity; j >= 0; j--)
            {
                if(j-stations[i].getNumberOfSubscribers() >= 0)
                {
                    R[j] = max(stations[i].getRevenue() + R[j-stations[i].getNumberOfSubscribers()], R[j]);
                }
            }
        }
    }

    // Print the results
    cout << "Value : " << R[capacity] << endl;
    cout << "Temps total : " << ((float)(clock() - startClock) / (float)CLOCKS_PER_SEC) << " s" << endl;

    delete[] R;

    return 0;
}

void LoadFromFile(std::string filePath, std::vector<BTS>& baseStations, int& capacity)
{
    fstream source(filePath);

    int numberOfStation;
    source >> numberOfStation;
    source >> capacity;

    for (int i = 0; i < numberOfStation; i++)
    {
        int index, revenue, numberOfSuscribers;
        source >> index;
        source >> revenue;
        source >> numberOfSuscribers;

        BTS station = BTS(index, revenue, numberOfSuscribers);

        baseStations.push_back(station);
    }

    source.close();
}

其余代码只是getter。现在我提供的文件作为输入:

10 25
    1     7     6
    2     4     4
    3     7     6
    4     2     1
    5     7     8
    6     9    10
    7     4     5
    8    10    10
    9     1     1
   10    10    10

1 个答案:

答案 0 :(得分:2)

您的memset不正确。你忘记了sizeof()

memset(R, 0, capacity + 1);

应该是:

memset(R, 0, (capacity + 1) * sizeof(int));

由于你没有将R全部归零,因此它的上半部分是未定义的并且正在为你提供垃圾数据。