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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2017, 22:26   #1
alexboliam
Пользователь
 
Регистрация: 10.10.2017
Сообщений: 44
По умолчанию Ошибка при удалении массива - 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, 00:10   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

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

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

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


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование деструктора при удалении элемента из массива dimavit Общие вопросы Delphi 23 23.06.2016 12: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