2016-08-22 2 views
-4

У меня есть следующий код на C++. Каждый раз, когда я запускаю его, он имеет другой выход. Почему это происходит? Это как-то связано с утечкой памяти?C++ случайные числа при возврате указателя из функции

#include <iostream> 

using namespace std; 
template <class T, class U> 
T f(T x, U y) 
{ 
    return x+y; 
} 
int f(int x, int y) 
{ 
    return x-y; 
} 
int main() 
{ 
    int *a=new int(4), b(16); 
    cout<<*f(a,b); 
    return 0; 
} 
+8

Это связано с тем, что вы пытаетесь изучить C++ методом проб и ошибок. Это не будет работать. Изучайте его систематически из хорошей книги. –

+0

@JesperJuhl, который говорит, что f возвращает int? Как a int *, который вводится в T? – lordjohncena

+0

@lordjohncena Я пропустил бит шаблона - следовательно, почему я удалил свой комментарий, когда понял. –

ответ

10

Вы передаете указатель и нормальный int к f, потому что

int *a=new int(4), b(16); 

работает как

int *a=new int(4); 
int b(16); 

Таким образом, в f, у вас есть T == int* и U == int, затем добавить int указателю и вернуть полученный указатель. Поскольку это не указывает на то, что вы владеете и инициализируете память, разыменовываете ее UB и можете давать мусор или сбой или делать то, что ему нравится.

Как я уже сказал в комментариях, вы не должны пытаться изучать C++ методом проб и ошибок, это действительно не сработает, поверьте. Изучайте его систематически из хорошей книги. Вы увидите, что нет необходимости использовать указатели для этого в первую очередь.

+0

Спасибо за ваше объяснение и за ваш совет. Я попробовал этот метод, потому что хотел попробовать кодировать свои собственные небольшие программы и, возможно, лучше понять C++. – locket23

+3

@ locket23 Добро пожаловать. Но я действительно не могу подчеркнуть, насколько важен для этого хороший учебный ресурс. C++ - довольно мощный инструмент, но это также лабиринт ловушек и плохой практики, которые будут укусить вас снова и снова, если вы не будете осторожны. –

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