C++;以前分配的数组在类外不可访问 我在C++中使用了一个表类,它在目前为止运行良好,但是从调用main函数的类调用[]]运算符,尽管它首先分配了数组,但是它仍然从数组中返回一个错误的值。p>

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

第一次调用(请参见带有//第一条注释的行)返回正确的值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 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;