stl map,set error:内存被破坏过去分配块的结尾

时间:2011-10-07 07:51:55

标签: c++ memory-management map set

当我试图解决这个采访问题时:找到一个数组中连续元素的总和,它等于一个目标数,所以我想出了下面的代码。但是,我真的不明白它为什么会有一些内存分配问题。以下是完整代码的link。当我试图将currSum的第二个元素插入到集合和映射中时,它将会出现一些错误消息,例如“内存被破坏的已分配块的结尾”。未设置,映射是否为插入动态分配?我真的不明白为什么它不像我想的那样工作。

我也在这里粘贴完整的代码:

        #include <map>
        #include <set>
        #include <iostream>
        using namespace std;

        void print_array(int arr[], int start, int end)
        {
            for(int i=start;i<=end;i++)
                cout<<arr[i]<<" ";
            cout<<endl;
        }

        //given an array, find the continous sum of the array which is a target number
        void findTargetSum(int arr[], int target, int sizeArr)
        {
            map<int, int> valIdxMap;
            set<int> prevSet;
            int* currSum= new int(sizeArr+1);
            currSum[0]=0;   
            for(int i=1;i<=sizeArr;i++)
            {
                currSum[i]=currSum[i-1]+arr[i-1];
            }

            //now the problem is to find two elements i, j in array currSum,where currSum[j]-currSum[i]=target && j>i
            for(int i=0; i<=sizeArr;i++)
            {
                int tmp=currSum[i]-target;
                set<int>::iterator iter=prevSet.find(tmp);
                if (iter !=prevSet.end())
                {
                    cout<<"located one range of array elements with sum to"<<target<<endl;
                    int startIdx=valIdxMap[*iter];
                    print_array(arr,startIdx,i-1);
                }
                else
                {
                    prevSet.insert(currSum[i]);
                    valIdxMap.insert(make_pair(currSum[i],i));
                }
            }
            delete currSum;
        }

        void testfindTargetSum()
        {
            int tst_arr[]={2,4,5,-1,3,8};
            int target=11;
            findTargetSum(tst_arr,11,6);
        }

        int main()
        {
           testfindTargetSum();
           return 1;
        }

2 个答案:

答案 0 :(得分:4)

错误在这一行:

int* currSum= new int(sizeArr+1);

该行获取单个int并将其初始化为值sizeArr+1。你可能意味着:

int* currSum= new int[sizeArr+1];

这将获得sizeArr+1类型的int元素块。此外,您必须将行delete currSum;更改为delete [] currSum;

另一方面,我的建议不是手动管理内存,而是使用标准容器,例如:

std::vector<int> currSum( sizeArr+1 );

基本上是当前实现的就地替代品,它将自动管理内存。

在实现时,我相信你实际上可以通过在迭代时累加三个变量中的起始索引,结束索引和值的总和而在O(N)中没有任何额外的内存。当累计值小于目标值时,增加结束索引并添加值。当累计值增长到高于目标值时,增加起始索引并将累计值减去该量。

答案 1 :(得分:3)

你写了

int* currSum= new int(sizeArr+1);
你可能意味着

int* currSum= new int[sizeArr+1];