C++ 为什么我的编译器在使用c+;中的动态分配内存时出错+;
在我使用“*”来区分动态分配内存的所有行中,即第23、25、44、49、54、55行。运算符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返回
[]
比运算符*
高。所以*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
定义为自动(本地)变量,正如您已经对vectorC
所做的那样,您看到的特定问题的解释是,您没有使用您认为是的运算符解除指针的引用:
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
。在这个节目中你当然不需要它。重写以使用