Форум программистов, компьютерный форум CyberForum.ru

delete динамического массива символов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
dlis
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 12
10.02.2012, 10:21     delete динамического массива символов #1
Простой код вываливается с ошибкой???

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream.h>
#include <string.h>
int main()
{  
    char * str;
    str = new char[11];
 
    str = "1234567890";
 
    char * surce = new char[11];
    strcpy(surce, str);
 
    delete [] str;   // вываливается с ошибкой !!!!
 
    return 0
}
в чём причина такого результата??
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bers
Заблокирован
10.02.2012, 10:25     delete динамического массива символов #2
Цитата Сообщение от dlis Посмотреть сообщение
в чём причина такого результата??
Сначала перенаправил указатель на константную область памяти. Потом решил потереть то, что является нерушимым и незыблемым.
dlis
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 12
10.02.2012, 10:37  [ТС]     delete динамического массива символов #3
так ведь strcpy() копирует содержимое строки

Добавлено через 6 минут
Цитата Сообщение от Bers Посмотреть сообщение
Сначала перенаправил указатель на константную область памяти. Потом решил потереть то, что является нерушимым и незыблемым.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int main()
{  
    char * str;
    str = new char[11];
    
    str = "1234567890";
 
    char * surce = new char[11];
 
    //strcpy(surce, str);
 
    for(int i=0; i<=strlen(str); surce[i++]=str[i]);
 
    delete [] str; // такое тоже вываливается!!!!
    return 0;
}
Bers
Заблокирован
10.02.2012, 10:38     delete динамического массива символов #4
Цитата Сообщение от dlis Посмотреть сообщение
так ведь strcpy() копирует содержимое строки
C++
1
2
3
4
5
        char * str;
        str = new char[11];  //вот здесь указатель смотрит на выделенный кусок памяти
 
        str = "1234567890"; //вот здесь он уже смотрит на другую область памяти. 
                                   //На константный массив чаров
Таким образом, адрес куска памяти, на который указатель смотрел изначально - утерян. Утечка памяти.
Сам же указатель теперь смотрит на начало константного массива.
C++
1
2
3
        char * surce = new char[11];
        strcpy(surce, str); //Здесь ты копируешь в область памяти на которую смотрит surce 
                                  //содержимое этого константного массива
C++
1
delete [] str;   // вываливается с ошибкой !!!!
А здесь ты пытаешь удалить память, на которую смотрит указатель str
А поскольку, он у тебя смотрит на константный массив, то удалить его он никак не может.
Итого: утечка памяти, + ошибка.
dlis
0 / 0 / 0
Регистрация: 21.01.2012
Сообщений: 12
10.02.2012, 10:43  [ТС]     delete динамического массива символов #5
благодарю за уяснение))
Код
char * str;
	str = new char[11];
	
	strcpy(str, "1234567890");

	char * surce = new char[11];
	strcpy(surce, str);

	bool fl = str == surce;


	//for(int i=0; i<=strlen(str); surce[i++]=str[i]);

	delete [] str;
	return 0;
такое работает без проблем)
Annushkash
0 / 0 / 0
Регистрация: 15.12.2015
Сообщений: 19
18.12.2015, 08:38     delete динамического массива символов #6
Здравствуйте! Пытаюсь реализовать шифрование RSA и у меня похожая проблема:
C++
1
2
3
4
5
6
unsigned char *Text = new unsigned char[length]; //создаю
Text = SystemStringToChar(txt); //присваиваю значение
                                             //unsigned char* SystemStringToChar(String^ string) {}
unsigned int *cryptoCode = new unsigned int[length];
cryptoCode = serial->Crypt(Text, length); //передаю в метод
delete [] Text;//при попытке удаления - ошибка
В чем проблема?
Lensato
49 / 49 / 24
Регистрация: 07.10.2015
Сообщений: 170
18.12.2015, 09:20     delete динамического массива символов #7
Цитата Сообщение от Annushkash Посмотреть сообщение
у меня похожая проблема
Да, проблема та же.
Цитата Сообщение от Annushkash Посмотреть сообщение
В чем проблема?
Описано выше.
SystemStringToChar(txt) скорее всего возвращает указатель на константу.
Annushkash
0 / 0 / 0
Регистрация: 15.12.2015
Сообщений: 19
18.12.2015, 19:04     delete динамического массива символов #8
Цитата Сообщение от Lensato Посмотреть сообщение
SystemStringToChar(txt) скорее всего возвращает указатель на константу.
Я написала в комментариях к коду сигнатуру этого метода. Вот его код:
C++
1
2
3
4
unsigned char* SystemStringToChar(String^ string)
{
    return (unsigned char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(string);
}
Возвращается указатель на массив char*, если я все правильно понимаю. Или я неправа?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.12.2015, 19:09     delete динамического массива символов
Еще ссылки по теме:

C++ Размер динамического массива
C++ Заданы два массива, new-delete, динамич. обл. памяти
C++ Почему при создании динамического массива через new ячейки массива имеют значение -842150451?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Skampf
Заблокирован
18.12.2015, 19:09     delete динамического массива символов #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "stdafx.h"
#include <iostream>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[]){
 
    setlocale(LC_ALL, "Russian");
    
    char * str = new char[11];
 
    gets_s(str,10);
 
    char * surce = new char[11];
    strcpy_s(surce,11, str);
 
 
    delete[] str;
 
    system("pause");    
        return 0;
}
В чем собственно проблема?
Yandex
Объявления
18.12.2015, 19:09     delete динамического массива символов
Ответ Создать тему
Опции темы

Текущее время: 06:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru