C++;以前分配的数组在类外不可访问 我在C++中使用了一个表类,它在目前为止运行良好,但是从调用main函数的类调用[]]运算符,尽管它首先分配了数组,但是它仍然从数组中返回一个错误的值。p>
第一次调用(请参见带有//第一条注释的行)返回正确的值1,而来自主函数的第二次调用(请参见//第二条注释)返回任意值,尽管具有相同的内存地址,这导致数组未正确分配(?)的结论。输出如下所示:C++;以前分配的数组在类外不可访问 我在C++中使用了一个表类,它在目前为止运行良好,但是从调用main函数的类调用[]]运算符,尽管它首先分配了数组,但是它仍然从数组中返回一个错误的值。p>,c++,C++,第一次调用(请参见带有//第一条注释的行)返回正确的值1,而来自主函数的第二次调用(请参见//第二条注释)返回任意值,尽管具有相同的内存地址,这导致数组未正确分配(?)的结论。输出如下所示: sumofallrows: 6 Array:[1,2,3,4,5,6] First element of table: 1 First element of n=1-th row: 2 First element of n=2-th row: 4 Created Table with 3
sumofallrows: 6
Array:[1,2,3,4,5,6]
First element of table: 1
First element of n=1-th row: 2
First element of n=2-th row: 4
Created Table with 3 rows and a size of 6 in internal representation!
here at n=1 0059F800,1
here at n=2 0059F800,-858993460
模板
类表{
公众:
int i,j;
int numberOfRows;
int sumOfAllRows=0;
int*lengthOfRows_2;;
T*内部数组;
T**开始向四周移动;
公众:
表(int numberOfRows,int lengthOfRows[]):
numberOfRows(numberOfRows),lengthOfRows(lengthOfRows)
{
对于(i=0;i
inttmparray[]={1,2,3,4,5,6};//TestData for=int
internalArray=tmpArray;
使用指向临时数组的指针覆盖以前分配的internalArray
(internalArray=new T[sumOfAllRows];
)
在表cter完成后,临时数组的存储“消失”-它被重新用于其他变量。幸运的是,您的代码没有分段/崩溃。
内部数组指向一个局部变量,一旦您走出了该控件,该变量就失去了范围。考虑复制长行[]数组。也就是说,如果int长度为[]= {1,2,3}。如果超出范围,该表将指向解除分配的MemoryTanks@MobyDisk,我将在此过程中进行更改!感谢您的正确回答!!我删除了分配并复制了数组,而不是任何想知道+1:)
template < typename T>
class Table{
public:
int i, j;
int numberOfRows_;
int sumOfAllRows = 0;
int* lengthOfRows_;
T* internalArray;
T** startOfEachRow;
public:
Table(int numberOfRows, int lengthOfRows[]) :
numberOfRows_(numberOfRows), lengthOfRows_(lengthOfRows)
{
for (i = 0; i < numberOfRows_; i++){
sumOfAllRows += lengthOfRows_[i];
};
cout << "sumofallrows: " << sumOfAllRows << "\n" ;
internalArray = new T[sumOfAllRows];
startOfEachRow = new T*[numberOfRows_];
int offset = 0;
//--------------------------------------------------------------//
int tmpArray[] = { 1, 2, 3, 4, 5, 6 }; //TestData for <T> = int
internalArray = tmpArray; //
cout << "Array:[" << internalArray[0]; //
for (i = 1; i < sumOfAllRows; i++){ //
cout << "," << internalArray[i]; //
}; //
cout << "]\n"; //
//--------------------------------------------------------------//
startOfEachRow[0] = &internalArray[0];
cout << "First element of table: \t" << startOfEachRow[0][0] << "\n";
for (i = 1; i < numberOfRows_; i++){
offset += lengthOfRows_[i - 1];
startOfEachRow[i] = &internalArray[offset];
cout << "First element of n="<<i<<"-th row:\t" << startOfEachRow[i][0] << "\n";
};
cout << "Created Table with " << numberOfRows_ << " rows and a size of " << sumOfAllRows << " in internal representation!\n";
int* tmp = new int[];
tmp = startOfEachRow[0];
cout << "here at n=1 " << &tmp[0] << "," << tmp[0] << "\n";//First Comment
}
size_t rowNum() const {
return numberOfRows_;
};
size_t colNum(size_t rowIdx) const {
return lengthOfRows_[rowIdx];
};
T* operator[](size_t rowIdx){
T* ptr = startOfEachRow[rowIdx];
return ptr;
};
};
int main(int argc, char** argv) {
int lengthOfRows[] = { 1, 2, 3 };
int numberOfRows = 3;
Table<int> testTable(numberOfRows, lengthOfRows);
int* tmp = testTable[0];
cout << "here at n=2 " << &tmp[0] << "," << tmp[0] << "\n"; //Second Comment
return 0;
}
int tmpArray[] = { 1, 2, 3, 4, 5, 6 }; //TestData for <T> = int
internalArray = tmpArray;