2016-01-12 2 views
1
int main(int argc, char argv) 
{ 
    int myarray[] = {1, 2, 3, 5}; 
    std::vector<int> array(myarray, myarray + 4); 
    std::vector<int> *p = testvector(array); 
    std::vector<int>::const_iterator it; 
    for(it=p->begin(); it != p->end(); ++ it) 
    { 
     printf("%d ", *it); 
    } 
    return 0; 
} 

std::vector<int> *testvector(std::vector<int> array) 
{ 
    return &array; 
} 

Выше мой тестовый код; что не так, что он вернулся 0 0 3 5 вместо 1 2 3 5Почему возврат вектора не имеет значения?

+5

Вы возвращаете ссылку на временное значение. Это неопределенное поведение. –

+0

Массив в 'testvector' - это копия массива, в который вы проходили. –

ответ

3

Посмотрите на std::vector<int> *testvector(std::vector<int> array) внимательно. Это принимает глубокую копию входного параметра array.

Возвращенный указатель будет dangling один раз array не входит в сферу применения. Поведение при разыменовании этого указателя будет undefined. Вот почему ваша программа ведет себя странно.

Интересно, если бы вы написали std::vector<int>& array в качестве параметра (т.е. принятый ссылкой), то это было бы работал, так как вы будете возвращать указатель на вектор, заданный в main! Этот код был бы чрезвычайно хрупкий, хотя.

0

это:

std::vector<int> *testvector(std::vector<int> array) 

следует заменить:

std::vector<int> *testvector(std::vector<int>& array) 

Live Demo

Однако, это не является реальным решением, так как нет никакого смысла из вашего примера. Я думаю, у вас есть проблема X, и вы просто публикуете Y. если вы опубликуете свою реальную проблему, вам будет легче помочь.

0

Изменить

std::vector<int> *testvector(std::vector<int> array) 

в

std::vector<int> *testvector(std::vector<int>& array) // Note the & 

В противном случае массив копируется в локальную переменную, которая разрушается в конце testvector() что сводит возвращенный указатель.

Смежные вопросы