Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
ssi
5 / 5 / 3
Регистрация: 24.01.2010
Сообщений: 52
#1

Signal: SIGABRT при delete[] - C++

30.04.2015, 07:58. Просмотров 382. Ответов 2
Метки нет (Все метки)

Здравствуйте.
Есть у меня такой метод:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
char *Request::addGetParam(char *link, const char *pKey, const char *val) const
{
    char *keyValString = new char[strlen(pKey) + 1 + strlen(val)];
    strcpy(keyValString, pKey);
    strcat(keyValString, "=");
    strcat(keyValString, val);
    size_t l = strlen(link) + 1 + strlen(keyValString);
    char *temp = new char[l];
    strcpy(temp, link);
    if (strchr(link, '?'))
    {
        strcat(temp, "&");
    }
    else
    {
        strcat(temp, "?");
    }
    strcat(temp, keyValString);
    delete[] keyValString;
    delete[] link;
    link = new char[l];
    strcpy(link, temp);
    delete[] temp;
    return link;
}
Программа падает тут(шестая снизу строка):
C++
1
delete[] link;
причём не сразу, а с третьего захода в метод(смотрите вызовы ниже):
C++
1
2
3
4
5
6
char *url = new char[strlen("https://api.vk.com/oauth/access_token")];
strcpy(url, "https://api.vk.com/oauth/access_token/");
url = addGetParam(url, "client_id", clientId);
url = addGetParam(url, "secret_key", secretKey);
url = addGetParam(url, "code", code);
url = addGetParam(url, "redirect_uri", "http://api.vk.com/blank.html");
т.е. вот тут(пятая сверху):
C++
1
url = addGetParam(url, "code", code);
В общем и целом мне, вроде бы ясно, что SIGABRT при попытке освободить память, возникает из-за того, что память была уже освобождена, либо способ удаления не соответствует способу выделения памяти(например, если выделяли как
C++
1
char *p = new char;
а удалить пытаемся
C++
1
delete[] p;
и наоборот).
Но я проверил, все адреса указателей разные(т.е. нигде нет такого, чтоб удалялся указатель на тот же адрес, что и link), память перед удалением была выделена для link в предыдущем заходе в метод и больше же нигде не удалялась.
Если убрать строчку
C++
1
delete[] temp;
то не падает. Но, повторюсь, адреса у указателей разные. В общем, мне не ясно, то ли лыжи не едут, то ли я не туда смотрю.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.04.2015, 07:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Signal: SIGABRT при delete[] (C++):

Ошибка Signal: SIGABRT - C++
Здравствуйте. Есть задача. Вот условия: Вот мой код. Он компилируется, но перед выходом из программы вылезает ошибка (Signal:...

Ошибка в xcode signal sigabrt, c++ - C++
Делаю класс матриц, при компиляции вылизает ошибка "Thread 1: signal SIGABRT". Возникает в диструкторе класса. Matrix::~Matrix() ...

Ошибка SIGABRT сразу при запуске - C++
Здравствуйте. Помогите пожалуйста, я в недоумении. Сразу при запуске вылетает сообщение о том, что перехвачен сигнал SIGABRT. Не могу...

Сигнал SIGABRT - C++
Почему выдает SIGABRT вот код test.cpp: #include "obj.h" int main() { Obj hun("/home/nikita/untitled.obj"); ...

В чем разница между delete и delete[]? - C++
а можете еще по подробней рассказать про delete, точнее даже delete, чем именно отличается delete от delete, т.к. я попробовал...

Ошибка при delete - C++
Здравствуйте, вылетает такая ошибка, почему? Указатель верный, до этого места все нормально работает

2
DrOffset
7509 / 4505 / 1023
Регистрация: 30.01.2014
Сообщений: 7,362
30.04.2015, 09:32 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от ssi Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
    char *temp = new char[l];
    strcpy(temp, link);
    if (strchr(link, '?'))
    {
        strcat(temp, "&");
    }
    else
    {
        strcat(temp, "?");
    }
    strcat(temp, keyValString);
Вот в этом коде тебе нужно удостовериться, что строка, которую ты сохраняешь в temp, не превышает в результате значения l (с учетом последнего нуля).
1
ssi
5 / 5 / 3
Регистрация: 24.01.2010
Сообщений: 52
30.04.2015, 10:32  [ТС] #3
Спасибо большое. Действительно, в вычислении l
C++
1
size_t l = strlen(link) + 1 + strlen(keyValString);
и последующем выделении памяти
C++
1
char *temp = new char[l];
C++
1
link = new char[l];
ошибся на единичку, не учёл последний ноль.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2015, 10:32
Привет! Вот еще темы с ответами:

SIGABRT после free malloc - C++
не могу почистить string array matches (2 dim) проблема возникает на линии 114 отмеченной как //Cleaning up an array не могу почистить...

Ошибка "Signal received" при использовании taglib - C++
Когда пытаюсь вывести id3v2->artist(или любое другое ), вне функции где инициализировал id3v2, вылетает signal received;(библиотека taglib)...

Ошибка при использовании new[] / delete[] - C++
Здравствуйте. Пишу учебную программу, моделирующую движение лифта (если кто учебник Дейтелов читал, тот поймет :) ). Для начала приведу...

_block_type_is_valid при вызове delete() - C++
код для генерации случайного графа #define m 3 //Число входящих и исходящих ребер. #define N 200 //Минимально требуемое число...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

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