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

С++ для начинающих

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

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

10.02.2012, 10:21. Просмотров 1381. Ответов 8
Метки нет (Все метки)

Простой код вываливается с ошибкой???

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
}
в чём причина такого результата??
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.02.2012, 10:21     delete динамического массива символов
Посмотрите здесь:

Правильное удаление двумерного динамического массива ( нужен ли delete[] array ) - C++
В одном из постов форума Увидев код одного из участников форума: Я пришел в замешательство, когда мне сказали, что delete arr после...

Удаление двумерного динамического массива символов - C++
Программа разбивает строку на слова и записывает каждое слово по отдельности в двумерный динамический массив, чтоб потом сравнить. Когда в...

Возникает ошибка при удалении динамического массива символов в деструкторе класса - C++
Всем привет. Есть приватная переменная, указатель на строку wchar_t *pUAgent; В конструкторе я ее инициализирую: pUAgent =...

Операторы динамического выделения памяти - new/delete - C++
Здравствуйте. Я немного не понимаю некоторый момент, связанный с динамическим выделением памяти, а именно - с объемом выделяемой...

Реализовать функцию Delete(s, i, n), возвращающую строку, полученную удалением из строки s n символов - C++
Реализовать функцию Delete(s, i, n), возвращающую строку, полученную удалением из строки s n символов, начиная с i-го. Не использовать...

Delete [] для статического массива - C++
Здравствуйте! Подскажите, пожалуйста, что происходит при вызове delete к статическому массиву. Приводит ли это к ошибкам или утечкам...

Ошибка при удалении массива с помощью delete - C++
Изучаю C++ и у меня задание разбить текст неопределенной длинны на массив строк. Нацарапал класс типа string ниже выложу. В него задача...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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 динамического массива символов
Еще ссылки по теме:

Заданы два массива, new-delete, динамич. обл. памяти - C++
Помогите решить задачу с учетом этого : Массивы создаются в динамической области памяти с использованием операций NEW и DELETE. Ввод...

Как компилятор узнаёт о размере массива при выполнении операции delete? - C++
Такой глупый вопрос появился при изучении операций new и delete. Я создаю указатель на массив int с помощью операции new. int size; ...

Очистка динамического массива - C++
Ребят помогите разобраться откуда проблема , Выводит все правильно но после закрытия программы ошибка вылетает . Знаю что дело в том...

Удаление динамического массива - C++
Привет. Сделал программу с 3 динамическими массивами, но дело в том, что 2 из них, размер которых задается с клавиатуры, удаляются в конце...

Удаление динамического массива - C++
Здравствуйте! Имею следующий вопрос: создаётся массив таким образом: int elCount = 10; double* x = new double;


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

Или воспользуйтесь поиском по форуму:
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 динамического массива символов
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru