我需要能够在不使用C ++智能指针的情况下做到这一点。我尝试了以下
grep -q " $"
但是在double* VecToArr(std::vector<std::vector<double>> vec) {
double* newarr=new double(vec.size());
for (int i=0; i<vec.size(); i++) {
std::copy(vec[i].begin(), vec[i].end(), newarr);
newarr += vec[i].size();
}
std::cout<<"inside \n";
for (int i=0; i<vec.size(); i++) {
std::cout<<newarr[i]<<"\n";
}
return newarr;
}
int main(){
std::vector<double> x{1,2};
std::vector<double> y{3,4};
std::vector<std::vector<double>>vec;
vec.push_back(x);
vec.push_back(y);
double *arr=VecToArr(vec);
std::cout<<"outside \n";
for (int i=0; i<4; i++) {
std::cout<<arr[i]<<"\n";
}
}
中,输出为:
VecToArr
不是我所期望的inside
4.54e-322 2.18e-317 4.34e-311 4.24e-314
在它之外,我得到相同的垃圾值。为什么会这样?
此外,由于我使用1 2 3 4
在new
内创建newarr
,我该如何VecToArr
呢?在delete
中,我打印出值之后,是否只做main.cpp
?
编辑
当我将功能更改为:
delete arr[]
现在的输出为double* VecToArr(std::vector<std::vector<double>> vec) {
double* newarr=new double[vec.size()*vec[0].size()];
for (int i=0; i<vec.size(); i++) {
std::copy(vec[i].begin(), vec[i].end(), newarr);
newarr += vec[i].size();
}
std::cout<<"inside \n";
for (int i=0; i<vec.size(); i++) {
std::cout<<newarr[i]<<"\n";
}
return newarr;
}
,而不是3 4 (garbage) (garbage)
。
答案 0 :(得分:1)
三个主要问题与评论中提到的其他问题相同。首先,您使用了错误的新表达式类型,new double(...)
只是为单个double分配了内存,并使用提供的值对其进行了初始化。您可能希望new double[...]
分配一个双精度数组。
第二,提供给此新控件的大小不正确,仅表示向量的第一维(当它必须是所有嵌套向量大小的总和时)。
最后,您返回的是newarr
,该值已由函数内的for循环修改,并最终指向分配发生后的内存,您可能希望创建一个临时副本在开始时返回它,然后返回它。
所有更改之后,最终的正确功能可能如下所示:
double* VecToArr(std::vector<std::vector<double>> vec) {
std::size_t totalsize = 0;
for (int i=0; i<vec.size(); i++) {
totalsize += vec[i].size();
}
double* newarr=new double[totalsize];
double* walkarr=newarr;
for (int i=0; i<vec.size(); i++) {
std::copy(vec[i].begin(), vec[i].end(), walkarr);
walkarr += vec[i].size();
}
return newarr;
}
我还建议通过常量引用传递向量,因为当前(按当前值)通过值传递向量,没有任何理由会导致不必要的开销。另外,您应该尝试始终使用std::vector
(或至少是智能指针)之类的东西来分配内存,而不要直接使用new
/ delete
(除非处理底层容器实现)因为通常没有太多的理由以牺牲程序的内存泄漏为代价。
答案 1 :(得分:1)
看看这段代码:
double* newarr=new double[vec.size()];
for (int i=0; i<vec.size(); i++) {
std::copy(vec[i].begin(), vec[i].end(), newarr);
newarr += vec[i].size();
}
这里违反了一个简单的数学逻辑。您将newarr
分配为vec
的大小。到目前为止,一切都很好。现在,对于vec
中的每个元素,您将指针增加vec[i].size
-有效地导致SUM(vec[i].size())
的使用大小。这是不对的,您可以通过访问超出分配范围的数组来在程序中具有未定义的行为。
请注意,我还修复了您的代码中的错字-您的new double(vec.size())
的原始版本分配了一个双精度字,而不是一个数组。
答案 2 :(得分:1)
内存分配,索引编制和指针算法存在问题。我已经在您的代码中指出了这些。
#include <iostream>
#include <vector>
double* VecToArr(const std::vector<std::vector<double>>& vec) {
double* newarr=new double[vec.size() * vec[0].size()]; // <-- you have 4 elements (also notice square brackets)
double* newarr_ptr_copy = newarr;
for (int i=0; i<vec.size(); i++) {
std::copy(vec[i].begin(), vec[i].end(), newarr_ptr_copy);
newarr_ptr_copy += vec[i].size(); // don't lose track of newarr
}
std::cout<<"inside \n";
for (int i=0; i<vec.size(); i++) {
std::cout<<newarr[i]<<"\n";
}
return newarr;
}
int main(){
std::vector<double> x{1,2};
std::vector<double> y{3,4};
std::vector<std::vector<double>>vec;
vec.push_back(x);
vec.push_back(y);
double *arr=VecToArr(vec);
std::cout<<"outside \n";
for (int i=0; i<4; i++) {
std::cout<<arr[i]<<"\n";
}
delete [] arr; // make sure that you release the memory that you allocated
}