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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2015, 00:39   #1
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 164
По умолчанию нужно ли удалять указатель на символьный массив созданный в куче(динамически распределяемой памяти)

Подскажите, программа состоит из 2 функций (main и fun), программа меняет значение указателя на символьный массив созданный в динамически распределяемой памяти.
Программ меняет символьный массив "abc" на "cba" ошибок нет. Вопрос в другом, нужно ли удалять указатель из кучи в функции main или fun, не произойдет ли утечка памяти,
не становиться ли указатель str_f из функции fun "диким" при завершении функции fun??? При попытке удалить указатель delete str_f или delete[] str_f, при выполнении программы выходит ошибка.




Код:
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <windows.h>

using namespace std;
char* fun()
{
   char* str_f=new char[5];
   ZeroMemory(str_f, 5);
   str_f="cba";
   /* delete str_f;  нужно ли удалять указатель массив char из динамически распределяемой памяти. При выполнении выходит ошибка */
   return str_f; 
}
int _tmain(int argc, _TCHAR* argv[])
{
	
	int n=5;
	char* str=new char[5];
	ZeroMemory(str, 5);
	str="abc";
	cout<<str <<endl;
	str=fun();
	cout<<str <<endl;
	/* delete[] str; нужно ли удалять указатель массив char из динамически распределяемой памяти. При выполнении выходит ошибка */
	cout<<str;
	getch();
	return 0;
	
}
polin11 вне форума Ответить с цитированием
Старый 08.08.2015, 02:02   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
не произойдет ли утечка памяти
произойдет конечно.

А ошибка потому что тут
Код:
str_f="cba";
создается новый строковой литерал и указатель на него присваивается в str_f. То есть в str_f после этого уже нет указателя на то, что new выделено было.

Тут strcpy надо использовать скорее всего. А еще лучше std::string раз С++.

Ну и если у вас функция возвращает указатель, то очевидно нельзя освобождать эту память в этой функции.

Вообще обычно в С делают не так, что функция выделяет память, записывает туда что-то и возвращает указатель, а так, что вызывающий функцию должен выделить память и передать указатель.

То есть примерно так:
Код:
void fun(char* str_f)
{
   strcpy(str_f, "cba");
}

int main()
{
    char* str_f = new char[5];

    fun(str_f);

    cout << str_f;

    delete str_f;
    str_f = nullptr;
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 08.08.2015 в 02:08.
Alex11223 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамически созданный TDBLookUpComboBox Scorpuha БД в Delphi 13 16.01.2014 19:59
Обработчик на динамически созданный компонент lexo Общие вопросы Delphi 5 01.06.2013 20:27
выделение памяти под динамически массив Дмитрий Ас Помощь студентам 0 22.12.2012 01:39
Динамически созданный tabSheet S@fer Общие вопросы Delphi 7 08.04.2009 12:03