Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
ssi
5 / 5 / 5
Регистрация: 24.01.2010
Сообщений: 52
#1

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

30.04.2015, 07:58. Просмотров 439. Ответов 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;
причём не сразу, а с третьего захода в метод(смотрите вызовы ниже):
http://www.cyberforum.ru/cpp-beginners/thread1683009.html
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.04.2015, 07:58
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Signal: SIGABRT при delete[] (C++):

Ошибка в xcode signal sigabrt, c++
Делаю класс матриц, при компиляции вылизает ошибка "Thread 1: signal SIGABRT". ...

Выдаёт предупреждение Thread 1: signal SIGABRT
помогите пожалуйста в 24 строке выдаёт следующую ошибку Thread 1: signal...

Ошибка SIGABRT сразу при запуске
Здравствуйте. Помогите пожалуйста, я в недоумении. Сразу при запуске...

Используя delete по указателю, возвращенному new [] или delete [] указателем, возвращаемым new
Помогите ответить на вопрос, не могу понять суть вопроса (правильно ли понимаю,...

Сигнал SIGABRT
Почему выдает SIGABRT вот код test.cpp: #include "obj.h" int main() {...

2
DrOffset
7517 / 4513 / 1097
Регистрация: 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 / 5
Регистрация: 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
Привет! Вот еще темы с решениями:

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

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

SIGABRT после free malloc
не могу почистить string array matches (2 dim) проблема возникает на линии 114...

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


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

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

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