Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 28.12.2017, 23:26   #1
alexboliam
Пользователь
 
Регистрация: 10.10.2017
Сообщений: 37
Репутация: 10
По умолчанию Ошибка при удалении массива - C++

Программа работает нормально, но в конце при удалении выдает ошибку "Invalid address specified to RtlValidateHeap( 0000014A67F60000, 00000031EF93F437 )". Открывается файл delete_scalar.cpp и пишется "*название файла* вызвал срабатывание точки останова." Поясните, как её избежать.
Код:

#include "stdafx.h"
#include <iostream>
#include <utility>
#include <cstring>
#include <stdio.h>
using namespace std;
 
int create_words(char*, char**);
void sort(char**, int);
 
int main()
{
    char **arr;
    arr = new char*[100];
    char s[100];
    puts("enter string: ");
    gets_s(s);
    int i = create_words(s, arr);
    sort(arr, i);
    for (int i = 0; i < 100; i++) {
        delete[] arr[i];
    }
    delete[] arr;
    system("pause");
}
int create_words(char *s, char **mas)
{
    int k = 0;
    char *delimiter = " ";
    char *p;
    char *np = NULL;
    p = strtok_s(s, delimiter, &np);
    while (k < 20 && p != NULL)
    {
        mas[k++] = p;
        p = strtok_s(NULL, delimiter, &np);
    }
    for (int i = 0; i < k; i++)
    {
        cout << mas[i] << "  " << endl;
    }
    return k;
}
 
void sort(char **arr, int size)
{
    for (int i = 0; i < size - 1; ++i)
        for (int j = 0; j < size - 1; ++j)
            if (strlen(arr[j + 1]) < strlen(arr[j]))
                swap(arr[j], arr[j + 1]);
}

alexboliam вне форума   Ответить с цитированием
Старый 29.12.2017, 01:10   #2
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,476
Репутация: 1667
По умолчанию

Ну так new вызывается один раз а delete - много-много раз.
Подумайте что именно у вас выделяется и что именно удаляется.
waleri вне форума   Ответить с цитированием
Старый 29.12.2017, 02:15   #3
alexboliam
Пользователь
 
Регистрация: 10.10.2017
Сообщений: 37
Репутация: 10
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Ну так new вызывается один раз а delete - много-много раз.
Подумайте что именно у вас выделяется и что именно удаляется.
Ну, выходит что я создаю память под весь массив строк, а удаляю сначала каждый элемент отдельно, а потом и сам массив? Подскажите, пожалуйста что поменять, если я не правильно думаю.
P.S. И обязательно ли удалять после выполнения программы массив?
P.P.S. Нужно просто оставить
Код:

delete[] arr;

, а цикл убрать?

Последний раз редактировалось alexboliam; 29.12.2017 в 03:05.
alexboliam вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование деструктора при удалении элемента из массива dimavit Общие вопросы Delphi 23 23.06.2016 13:49
Ошибка при удалении компонента Putin-mode Общие вопросы Delphi 18 24.01.2012 23:28
Ошибка при удалении из БД!!! Delphi 7. NuR1k БД в Delphi 2 21.08.2010 19:19
ошибка при удалении символа Virus191288 Общие вопросы Delphi 13 15.08.2009 14:50
Ошибка при удалении... JRcoker Общие вопросы Delphi 8 29.07.2008 22:53


13:51.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru