C++ 返回引用后用垃圾替换数组(对象的属性)中的值

C++ 返回引用后用垃圾替换数组(对象的属性)中的值,c++,arrays,object,pointers,scope,C++,Arrays,Object,Pointers,Scope,我正在尝试实现稀疏矩阵加法(附代码), 由于C++不喜欢2D动态数组,所以我使用三个不同的数组 表示行索引、列索引和相应的值 假设我加上A和B得到C C=A。添加(B) 在addmember函数中,我将地址返回到新创建的 C矩阵 在返回C之前,一切正常,因为A->C在数组中有预期值, 但一旦我将C存储在主函数的另一个标识符中,然后通过新对象打印相同的数组,我就会在一些数组中找到垃圾 我所尝试的: 起初,我在Add函数中创建对象,然后 返回对象,尝试使用/不使用新关键字 我认为这可能是作用域的问

我正在尝试实现稀疏矩阵加法(附代码), 由于C++不喜欢2D动态数组,所以我使用三个不同的数组 表示行索引、列索引和相应的值

假设我加上A和B得到C

C=A。添加(B)

在addmember函数中,我将地址返回到新创建的 C矩阵

在返回C之前,一切正常,因为A->C在数组中有预期值, 但一旦我将C存储在主函数的另一个标识符中,然后通过新对象打印相同的数组,我就会在一些数组中找到垃圾

我所尝试的:

  • 起初,我在Add函数中创建对象,然后 返回对象,尝试使用/不使用新关键字
  • 我认为这可能是作用域的问题,所以,现在我使用矩阵a的属性来实例化新的C矩阵,以存储 新创建的矩阵,然后将地址返回给它
调试:

  • 数组位于.add()函数使用前后的相同地址,但打印的值不同

问题出在
add()
方法中。您正在堆栈上创建数组,并将其地址传递给新的
sparse
实例。从add()返回后,这些数组不再有效。您想使用
new
-操作符在堆上分配这些数组:
int*crindex=newint[this->len+b.len]
。但是,您还必须释放这些数组(在某个时候使用
delete[]
,否则您将泄漏内存)

<>这是从C++开始时的一个常见错误。您可能想阅读更多关于“堆栈与堆分配”的内容。例如,尝试以下问题:

如果你是C++新手,我建议在普通数组中使用STD::向量,因为它们不易出错。所以你的班级看起来是这样的:

#include<vector>
class sparse{
        public:
            //int rows , cols, len ; <-- use rindex.size() instead
            //int arr;
            std::vector<int> rindex, cindex, vals;
}
#包括
类稀疏{
公众:

//int rows,cols,len;问题出在
add()
方法中。您正在堆栈上创建数组,并将其地址传递给新的
sparse
实例。从add()返回后这些数组不再有效。您希望使用
new
-运算符在堆上分配这些数组:
int*crindex=new int[this->len+b.len]
。但是您还必须释放这些数组(在某个时候使用
delete[]
,否则您将泄漏内存)

<>这是一个常见的错误,从C++开始时,你可能想读更多关于“堆栈和堆分配”的例子。

如果你是C++新手,我推荐使用STD::向量在普通数组上,因为它们不易出错。所以你的类看起来是这样的:

#include<vector>
class sparse{
        public:
            //int rows , cols, len ; <-- use rindex.size() instead
            //int arr;
            std::vector<int> rindex, cindex, vals;
}
#包括
类稀疏{
公众:

//int rows,cols,len;你能从你的例子中删去所有多余的部分直到你得到a吗?这是在删除了一个重要的部分之后,我担心我可能会删除其中的一些重要部分,请告诉我是否有一些特定的部分我可以删除o.T.:
sparse*c;
作为成员变量有什么理由吗?我会将它设为loc
sparce::add()
中的所有变量。实际上,我会放下指针和
new
并按值返回(计数)。与此相反,我会将
add()
中的参数设置为常量引用,即
sparse add(const sparse&b)
。调用
add()时,无需复制
b
,是吗?@scheff我不确定是否得到了(返回值优化)部分,但在此版本之前,我尝试创建一个本地对象,正如我在“我尝试了什么”部分中所述在成员中只存储指向构造函数中传递的数组的指针-这非常危险。在这种情况下,
sparce
应该拥有这些数组的所有权。A
std::vector
似乎适合我(而不是指针)。(顺便说一句,这将使默认副本构造函数按预期工作。)你能从你的例子中删掉所有多余的部分直到你得到a吗?这是在删除了一个重要部分之后,我担心我可能会删除其中的一些重要部分,请让我知道是否有一些特定的部分我可以删除。T.:有什么理由让
sparse*c;
成为一个成员变量吗?我会在
spar中将其作为一个局部变量ce::add()
。实际上,我会放下指针和
new
,并按值返回(计数)。与此相反,我会将
add()
中的参数设置为常量引用,即
sparse add(const sparse&b)
。调用
add()时,无需复制
b
,是吗?@scheff我不确定是否得到了(返回值优化)部分,但在此版本之前,我尝试创建一个本地对象,正如我在“我尝试了什么”部分中所述在成员中只存储指向构造函数中传递的数组的指针-这非常危险。在这种情况下,
sparce
应该拥有这些数组的所有权。A
std::vector
似乎适合我(而不是指针)。(顺便说一句,这将使默认副本构造函数按预期工作。)如果你是C++的新手,我建议使用简单的数组:因为它们不容易出错。如果你不是新的,我会推荐相同的。。-一般来说,C++中的C数组的需求更少。嘿,答案是,我得到了栈和堆堆的部分,并且在同一代码中尝试向量,现在我用VEC改变了数组。to vector的构造函数的TOR和形式参数以及主函数中的实际参数……但是当您尝试访问无效的内存位置(即,不是程序的一部分)时,会出现分段错误分段错误。我猜您有一个索引poi
#include<vector>
class sparse{
        public:
            //int rows , cols, len ; <-- use rindex.size() instead
            //int arr;
            std::vector<int> rindex, cindex, vals;
}