C++ 为什么我的编译器在使用c+;中的动态分配内存时出错+;

C++ 为什么我的编译器在使用c+;中的动态分配内存时出错+;,c++,pointers,memory-management,dereference,C++,Pointers,Memory Management,Dereference,在我使用“*”来区分动态分配内存的所有行中,即第23、25、44、49、54、55行。运算符[]比运算符*高。所以*left[i]的意思是“从left中获取索引i,然后取消对它的引用。”实际上,您想要的是“取消对left的引用,然后从结果中获取索引i”,它将被表示为(*left)[i] 其他向量指针也一样:(*右)[i],(*合并)[i] 尽管实际上没有理由在这里使用动态分配,而且因为您在调用new时没有任何相应的deletes,所以您正在泄漏内存。在从函数split和count\u inv返回

在我使用“*”来区分动态分配内存的所有行中,即第23、25、44、49、54、55行。

运算符
[]
比运算符
*
高。所以
*left[i]
的意思是“从
left
中获取索引
i
,然后取消对它的引用。”实际上,您想要的是“取消对
left
的引用,然后从结果中获取索引
i
”,它将被表示为
(*left)[i]

其他向量指针也一样:
(*右)[i]
(*合并)[i]


尽管实际上没有理由在这里使用动态分配,而且因为您在调用
new
时没有任何相应的
delete
s,所以您正在泄漏内存。在从函数
split
count\u inv
返回之前,您需要
delete
动态分配的
vector
对象,或者更明智地将向量
left
right
merged
定义为自动(本地)变量,正如您已经为向量
C

所做的那样,运算符
[]
的值高于运算符
*
。所以
*left[i]
的意思是“从
left
中获取索引
i
,然后取消对它的引用。”实际上,您想要的是“取消对
left
的引用,然后从结果中获取索引
i
”,它将被表示为
(*left)[i]

其他向量指针也一样:
(*右)[i]
(*合并)[i]


尽管实际上没有理由在这里使用动态分配,而且因为您在调用
new
时没有任何相应的
delete
s,所以您正在泄漏内存。在从函数
split
count\u inv
返回之前,您需要
delete
动态分配的
vector
对象,或者更明智地将向量
left
right
merged
定义为自动(本地)变量,正如您已经对vector
C
所做的那样,您看到的特定问题的解释是,您没有使用您认为是的运算符解除指针的引用:

Severity    Code    Description Project File    Line    Suppression State
Error (active)  E0349   no operator "*" matches these operands  
这将获取编译器认为是向量数组的第i个元素,然后尝试用一元
*
对其进行解引用,这显然是行不通的。只需将其括起来即可解决此问题:
(*left)[i]

但是,您的代码存在更深层次的问题。用“<代码>新< /代码>”在堆上分配标准容器通常是不理解如何使用C++标准库的标志。你说“上面的代码需要一些动态内存分配”,但这可能不是真的

看看这个:

*left[i]
vector count\u inv(vector&left,vector&right,int&count)
{
向量*合并;
//剪断
合并=新向量(left.size()+right.size()-2);
返回*合并;
}
撇开这会泄漏内存这一事实不谈,您可以这样做:

vector<long long> count_inv(vector<long long> &left, vector<long long> &right, int &count)
{
    vector<long long> *merged;
    // snip
    merged = new vector<long long>(left.size() + right.size() - 2);
    return *merged;
}
vector count\u inv(vector&left,vector&right,int&count)
{
向量合并(left.size()+right.size()-2);
//剪断
返回合并;
}

这也同样有效。您可能需要花更多的时间学习使用标准容器的最佳方法。

因此,您看到的具体问题的解释是,您没有使用您认为是的运算符取消指针引用:

Severity    Code    Description Project File    Line    Suppression State
Error (active)  E0349   no operator "*" matches these operands  
这将获取编译器认为是向量数组的第i个元素,然后尝试用一元
*
对其进行解引用,这显然是行不通的。只需将其括起来即可解决此问题:
(*left)[i]

但是,您的代码存在更深层次的问题。用“<代码>新< /代码>”在堆上分配标准容器通常是不理解如何使用C++标准库的标志。你说“上面的代码需要一些动态内存分配”,但这可能不是真的

看看这个:

*left[i]
vector count\u inv(vector&left,vector&right,int&count)
{
向量*合并;
//剪断
合并=新向量(left.size()+right.size()-2);
返回*合并;
}
撇开这会泄漏内存这一事实不谈,您可以这样做:

vector<long long> count_inv(vector<long long> &left, vector<long long> &right, int &count)
{
    vector<long long> *merged;
    // snip
    merged = new vector<long long>(left.size() + right.size() - 2);
    return *merged;
}
vector count\u inv(vector&left,vector&right,int&count)
{
向量合并(left.size()+right.size()-2);
//剪断
返回合并;
}

这也同样有效。您可能需要花更多的时间来学习使用标准容器的最佳方法。

正如其他人所指出的,基本的语法问题是您关于如何解释
*symbol[i]
的假设是不正确的。打印出运算符优先级表并将其发布到眼睛级别(无论您在哪里编码)可能会做得很好(就像我多年来所做的那样)


这里有一个给ya的例子:

正如其他人所指出的,基本的语法问题是你关于如何解释
*symbol[i]
的假设是不正确的。打印出运算符优先级表并将其发布到眼睛级别(无论您在哪里编码)可能会做得很好(就像我多年来所做的那样)


下面是一个例子:

简而言之,向量不是对象,而是数组操作的接口。您通常不需要
新向量。在这个节目中你当然不需要它。重写以直接使用
std::vector
,而不使用任何指针。简而言之,vector不是对象,而是用于处理数组的接口。您通常不需要
新的vector
。在这个节目中你当然不需要它。重写以使用