Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2011, 16:05   #11
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

profi, кстати, я нашел в чем проблема. В выделении памяти в функции, но пока не нашел способ её решить. Вот при таком использовании:
Код:
WCHAR* SetNodeField(WCHAR* pSource)
{
	WCHAR* PtrT = new WCHAR[10];
	return PtrT;
};
валится прога с дебаг еррором, а если в основной функции выделить память, то не валится и работает отлично, учитывая выше написанный код в посте 9. Умные указатели чтоли всё-таки использовать? Больше нет варианта?
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 07.06.2011, 16:07   #12
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

profi, так неправильно!
Что есть pPointer? Переменная типа "указатель на WCHAR". Это вполне обычный тип, такой же как, например, int, double, char, bool. Давайте для ясности определим синоним для WCHAR*:
Код:
typedef WCHAR* PWCHAR;
Это совершенно нормальный тип, ничего особенного. Теперь посмотрим, что получается при такой записи.
Код:
bool DeletePointer(PWCHAR pPointer)
{
	if (pPointer != NULL) {
		delete [] pPointer;
		pPointer = NULL;
		return true;
	}
	else
		return false;
}
Итак, мы передаем в функцию переменную типа PWCHAR - по значению. Мы хотим изменить внутри функции значение этой переменной? Браво! Давайте пойдем дальше и сделаем то же самое для другого типа, например, int.
Код:
#include <iostream>

void f(int x)
{
x = 10;
}

int main()
{
int y = 1;
f(y);
std::cout << y;
}
Почему же у нас выводится на экран число 1, а не 10?...

UPD. ImmortalAlexSan, то же самое. Оператор new возвращает значение типа "указатель на...". В функции вы присваиваете это значение локальной копии переменной. Сделайте typedef, как я писал выше, и все будет гораздо более понятно. Я уже не раз тут писал, что переменную типа PWCHAR нужно передавать по указателю или ссылке, чтобы иметь возможность изменять ее значение внутри функции.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же

Последний раз редактировалось Гром; 07.06.2011 в 16:10.
Гром вне форума Ответить с цитированием
Старый 07.06.2011, 16:12   #13
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Гром, потому что функция создает локальную переменную, которую и меняет. У меня крыша сейчас поедет. А можно использоать LPWSTR? Это тоже WCHAR*. Попробовал я этот LPWSTR/PWCHAR - ничего не поменялось. Я прочитал, что указатель, который функция возвращает, это указатель на локальный объект внутри фунции и при удалении я не с той памятью просто работаю. Мне нужно в функции использовать new Гром, я пробовал делать, как вы написали - не выходит.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 07.06.2011 в 16:18.
ImmortalAlexSan вне форума Ответить с цитированием
Старый 07.06.2011, 16:22   #14
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Гром че ты нагородил. Если в функцию передается указатель, это уже не по значению, это передается адрес. Я подсказал правильно. Через
Код:
typedef WCHAR* PWCHAR;
до фонаря. Разница какая? При чем этот код:
Код:
#include <iostream>

void f(int x)
{
x = 10;
}

int main()
{
int y = 1;
f(y);
std::cout << y;
}
К тому, который выше. Если ты передаешь массив, то ты передаешь его адрес, а не копию. Ёпт. Тут нет передачи по значению. Если ты увидел покажи где? Выдели. ImmortalAlexSan тестил через Code::Blocks.
ImmortalAlexSan странно, что валится. Ради интереса скачай себе Code::Blocks. И попробуй там реализовать тот код, что ты сюда постил.

Последний раз редактировалось profi; 07.06.2011 в 16:34.
profi вне форума Ответить с цитированием
Старый 07.06.2011, 16:39   #15
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Сейчас попробую.
Я уехал... Как разбирусь - отпишусь.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 07.06.2011 в 17:08.
ImmortalAlexSan вне форума Ответить с цитированием
Старый 07.06.2011, 17:08   #16
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

profi, объясняю еще раз.
Цитата:
Если в функцию передается указатель, это уже не по значению, это передается адрес.
Да, адрес. Адрес переменной. Если мы хотим работать внутри функции с этой переменной - все нормально. Все хорошо, все работает.
А если нам нужно работать с указателем на эту переменную? Например, присвоить указателю значение?
Код:
#include <iostream>

void f(int* x)
{
x = new int;
}

int main()
{
int* y;
f(y);
delete y;
}
Попробуйте-ка скомпилировать такой примерчик. Что получите?

Что мы пытаемся здесь сделать? У нас есть указатель y. Этот указатель указывает на некую переменную типа int. Мы хотим выделить память для этой переменной. Для этого мы передаем в функцию указатель (пока еще не валидный), вызываем оператор new и присваиваем то, что он возвращает, этому указателю. Как бы все нормально, за одним ма-а-аленьким исключением - мы работаем не с переменной типа int, а с переменной типа int*, мы хотим, чтобы этой переменной в функции присвоили какое-то хорошее значение.
ЗАБУДЬТЕ, ЧТО y ИМЕЕТ ТИП "УКАЗАТЕЛЬ"! Это тоже переменная. И вот эту самую переменную мы и передаем в функцию. По значению. Epic fail.
Чтобы присвоить переменной типа int* какое-то значение, нужно переменную этого типа передать по указателю или по ссылке.
Код:
#include <iostream>

void f((int*)* x)   //Указатель на переменную типа int*
{
*x = new int;
}

int main()
{
int* y;
f(&y);
delete y;
}
Код:
#include <iostream>

void f((int*)& x)   //Ссылка на переменную типа int*
{
*x = new int;
}

int main()
{
int* y;
f(y);
delete y;
}
Если до сих пор непонятно - советую покурить стандарт C++ напополам с чем-нибудь еще более запрещенным. Должно помочь.
DIXI.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 07.06.2011, 17:15   #17
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

[удалил сам]

Последний раз редактировалось profi; 07.06.2011 в 17:52.
profi вне форума Ответить с цитированием
Старый 07.06.2011, 17:18   #18
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Гром, profi, проблема решена. Спасибо, вам ребят. тут много кода правильного приведено, но ошибка была вто тут:
Код:
	
	GlobalPtr = new WCHAR[j];
           for (i = 0; i <= j; i++) { //НЕ МЕНЬШЕ РАВНО! А СТРОГО МЕНЬШЕ!
		GlobalPtr[i] = *PtrS;
		if (i != j)
			PtrS++;
	};
Получается записывал не в свою область, акогда удалить пытался, он мне и писал, что я за кучу вышел блин два дня убил на эту фигню! хахаха
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 07.06.2011, 17:49   #19
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Гром, стыдно, извиняюсь, тупанул.
Код:
bool DeletePointer(int*& pPointer)
profi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужно написать программу в debug melkaya9112 Помощь студентам 1 09.12.2010 01:01
Visual Studio 2010, при запуске на debug или rebuild вылетает ошибка Evgeniy1989 Общие вопросы .NET 1 20.08.2010 08:34
error C2541: 'delete' : cannot delete objects that are not pointers novokhatsky Общие вопросы C/C++ 2 14.12.2009 10:25
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main Debug/main.exe : fatal error LNK11 prefak Win Api 0 19.04.2009 16:51
Debug/DLL10.dll : fatal error LNK1136: invalid or corrupt file AHJLPeu* Общие вопросы C/C++ 2 23.10.2008 20:59