Vector 是什么导致了下面代码中的缓冲区溢出错误

Vector 是什么导致了下面代码中的缓冲区溢出错误,vector,heap-corruption,address-sanitizer,Vector,Heap Corruption,Address Sanitizer,无法在下面的代码中找出导致缓冲区溢出的原因。我认为这与矢量有关,但我要防止越界访问。是否还有其他可能导致溢出的原因 class Solution { public: bool canPartition(vector<int>& nums) { int sum = 0; bool canPartition = true; vector<vector<int>> dp(nums.size(), vec

无法在下面的代码中找出导致缓冲区溢出的原因。我认为这与矢量有关,但我要防止越界访问。是否还有其他可能导致溢出的原因

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int sum = 0;
        bool canPartition = true;
        vector<vector<int>> dp(nums.size(), vector<int>(sum / 2 + 1, -1));
        sum = accumulate(nums.begin(),nums.end(),0);
        if (sum % 2 != 0)
        {
            canPartition = false;
        }
        if (true == canPartition)
        {
            canPartition = canPartitionRecursive(nums, 0, sum/2, dp);
        }
        return canPartition;
    }
    bool canPartitionRecursive(vector<int>& nums, int index, int sum, 
                               vector<vector<int>>& dp)
    {
        if (sum == 0)
        {
            return true;
        }
        if (index >= nums.size() || sum < 0)
        {
            return false;
        }
        if (dp[index][sum] != -1)
        {
            if (true == canPartitionRecursive(nums, index+1, sum - nums[index],dp))
            {
                dp[index][sum] = 1;
                return true;
            }
            dp[index][sum] = canPartitionRecursive(nums, index + 1, sum, dp);
        }
        return dp[index][sum] = 1? true:false;
    }
};
类解决方案{
公众:
布尔canPartition(向量和nums){
整数和=0;
bool canPartition=true;
向量dp(nums.size(),向量(sum/2+1,-1));
sum=累计(nums.begin(),nums.end(),0);
如果(总和%2!=0)
{
canPartition=false;
}
if(true==canPartition)
{
canPartition=canPartitionRecursive(nums,0,sum/2,dp);
}
返回分区;
}
布尔canPartitionRecursive(向量和nums、整数索引、整数和、,
向量和dp)
{
如果(总和=0)
{
返回true;
}
如果(索引>=nums.size()||和<0)
{
返回false;
}
如果(dp[索引][总和]!=-1)
{
if(true==canPartitionRecursive(nums,index+1,sum-nums[index],dp))
{
dp[指数][总和]=1;
返回true;
}
dp[index][sum]=canPartitionRecursive(nums,index+1,sum,dp);
}
返回dp[index][sum]=1?真:假;
}
};

这看起来像是一个换位错误(所有子向量的大小都为1):

int和=0;
向量dp(nums.size(),向量(sum/2+1,-1));
sum=累计(nums.begin(),nums.end(),0);
也许应该在
dp
初始化之前移动
sum
的计算

int sum = 0;
vector<vector<int>> dp(nums.size(), vector<int>(sum / 2 + 1, -1));
sum = accumulate(nums.begin(),nums.end(),0);