Получить длину динамического массива - PullRequest
0 голосов
/ 03 декабря 2011

Продолжая со связанного вопроса Динамические массивы шаблонов , я хотел бы объяснить еще две вещи:

  1. Я получил предупреждение от компилятора о том, чтокоманды копирования небезопасны: «Вызов функции с параметрами, которые могут быть небезопасными - этот вызов полагается вызывающей стороне на проверку правильности переданных значений». Насколько серьезна эта проблема и что можно сделать, чтобы ее преодолеть?

  2. Самое важное: я не могу правильно определить длину массива обычным способом.Окончательный размер массива рассчитывается до 1, хотя он содержит 3 элемента.Есть ли в коде ошибка или что-то работает по-другому из-за динамических массивов?

Вот мой код:

template<typename T>
void VectorHolder<T>::setArrays(T firstarray[],T secondarray[] ,int N1, int N2)
{

    array1 = new T[N1];
    array2 = new T[N2];

    std::copy(firstarray, firstarray + N1, array1);
    std::copy(secondarray, secondarray + N2, array2);

    int arraysize = sizeof(array1)/sizeof(T);

    cout<<"\narraysize: "<<arraysize<<endl;
    cout<<"\nFirst array contains: \n";

    for(int i=0; i<arraysize;i++)
        cout<<array1[i]<<endl;
}

Я получаю на выходе только один элемент, но массив содержит три.Если я изменю цикл for на

for(int i=0; i<N1;i++) 

, я получу правильный результат.Почему?

Ответы [ 4 ]

3 голосов
/ 03 декабря 2011

Рассматривали ли вы использование std::vector и его размер метод?

2 голосов
/ 26 сентября 2013

Вопрос 1:

Не обращайте особого внимания на это предупреждение. Он предупреждает вас о риске переполнения. Чтобы избавиться от этого, и если вы используете Visual Studio, добавьте это в свой файл:

#pragma warning( disable : 4996 )

Я предполагаю, что 4996 является кодом этого предупреждения.

Вопрос 2:

То что у вас есть:

array1 = new T[N1];

означает, что array1 является указателем на T:

T * array1;

Давайте предположим, что N2 намного больше, чем N1, , хотя вы обнаружите, что sizeof (array1) равно sizeof (array2) .

Полагаю, это связано с тем, что sizeof (array1) возвращает память, выделенную для самого указателя, а не для значения, на которое указывает указатель, но не уверен в этом ~.

Простой тест:

char * tab1;
tab1 = new char[3];

char * tab2;
tab2 = new char[100];

if( sizeof(tab1) == sizeof(tab2) )
{
    printf("equals");
}

вернет: "равно"

Чтобы решить эту проблему, попробуйте это :

std::vector<T> array1;

и рассмотрите возможность получения размера:

array1.size();
2 голосов
/ 03 декабря 2011

array1 это не массив, это указатель. Следовательно, его размер равен размеру указателя и является постоянным.

Подумайте об использовании стандартного контейнера, а не необработанного массива в стиле C.

1 голос
/ 03 декабря 2011

если вы действительно хотите использовать динамические массивы, то сделайте это правильно: никогда не используйте [], но всегда только указатели. Самое неприятное, что вы ДОЛЖНЫ передать размер массива отдельно и позаботиться о delete массиве. Обе эти проблемы сложны в сложных программах, и использование контейнеров, которые заботятся о них, является наиболее предпочтительным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...