Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: c++, призрачные функции  (Прочитано 18692 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mayor
Специалист

ru
Offline Offline

« : 13-12-2008 11:06 » 

c++, призрачные функции

в файле
Код:
#include <iostream>
using std::cout;

char* strcat(const char* s1,const char* s2) {
  ...
}


вызываю функцию strcat, вроде бы она и делает почти все что надо, но это не моя функция, в дальнейшем происходит завал на:
Код:
char *c=strcat(a,b);
cout<<c;
delete[] c;

почему это происходит?
Записан

1n c0de we trust
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 13-12-2008 11:14 » 

а где ты выделил c через new, чтобы потом его delete ? )

Это не код призрачный, а разработчики

если уж пользуют std , там вроде std::string есть, пусть не парятся с буферами для строк
« Последнее редактирование: 13-12-2008 11:15 от Алексей1153++ » Записан

Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 13-12-2008 11:32 » 

Происходит потому, что "c" указывает на область в чужом буфере, который не для него выделялось - не ему и освобождать.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #3 : 15-12-2008 06:22 » 

Mayor1, RTFM бы хоть раз.
http://www.cplusplus.com/reference/clibrary/cstring/strcat.html
Цитата
Return Value
destination is returned.

Записан

Странно всё это....
Mayor
Специалист

ru
Offline Offline

« Ответ #4 : 15-12-2008 08:00 » 

Mayor1, RTFM бы хоть раз.
http://www.cplusplus.com/reference/clibrary/cstring/strcat.html
Цитата
Return Value
destination is returned.

это то тут причем?
еще раз прочитай первый пост:
1 я не включаю <cstring>
2 я не вношу std::strcat в глобальное пространство имен
3 раз я вызвал delete[] значит моя strcat использует возвращает указатель на new[]

отсюда вопрос: кто принял решение вызвать библиотечную функцию: компилятор или линковщик?
в формате объектного файла вызовы внутренних и внешних функций как-нибудь отличаются?


да кстати отсутвие предуепреждений компилятора: моя функция расценивается как перезагруженая, но библиотечная оказывается более подходит по параметрам, отсюда и не возникает ошибки из за двухсмысленности имени функции
« Последнее редактирование: 15-12-2008 08:02 от Mayor » Записан

1n c0de we trust
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 15-12-2008 08:07 » 

Mayor1,  ну и правильно. Делал бы ты каст в const char* для 1го параметра - тогда твоя функция ещё на что-то претендовала бы.

Кстати, ещё можно поспорить, насколько это хорошо с т.з. наглядности кода - возвращать выделенную память в качестве результата функции, а не аргумента char**. А равно - и насчёт того, насколько комильфо использовать имена стандартных функций в глобальном пространстве имён.
Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #6 : 15-12-2008 08:18 » 

Mayor1,  ну и правильно. Делал бы ты каст в const char* для 1го параметра - тогда твоя функция ещё на что-то претендовала бы.

Кстати, ещё можно поспорить, насколько это хорошо с т.з. наглядности кода - возвращать выделенную память в качестве результата функции, а не аргумента char**. А равно - и насчёт того, насколько комильфо использовать имена стандартных функций в глобальном пространстве имён.

да да знаю, new использовать только в конструкторах, из функций вместо char* возвращать auto_ptr, для строк написать свой класс если по оптимизации std::string неприемлим - но это в принципе некчему в студенческих задачках

что до имен стандартных функций, то я их всех поименно не знаю, так что рано или поздно случаются совпадения
Записан

1n c0de we trust
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #7 : 15-12-2008 10:24 » 

:: вначале поставь или помести в отдельный namespace
Записан

Странно всё это....
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 15-12-2008 11:25 » 

Mayor1,
что до имен стандартных функций, то я их всех поименно не знаю, так что рано или поздно случаются совпадения
Тогда не надо использовать using namespace std; Ага
Записан
Mayor
Специалист

ru
Offline Offline

« Ответ #9 : 15-12-2008 13:37 » 

Mayor1,
что до имен стандартных функций, то я их всех поименно не знаю, так что рано или поздно случаются совпадения
Тогда не надо использовать using namespace std; Ага

тоже посмотри в первый пост Улыбаюсь

я не использую using namespace std;
там есть только строчка
using std::cout;

тем не менее после
#include <iostream>
в глобальном пространстве имен появились
strlen,strcat,strcpy и еще черт знает что

зы отдельный namespace тоже не срабатывает:
после
using otnm::strlen
 компилятору без разницы что вызывать
::strlen или otnm::strlen
Записан

1n c0de we trust
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 15-12-2008 13:53 » 

<iostream> включил? А там по цепочке и cstring включается, и string.h, и всё это в глобальный неймспейс (насчёт using был неправ - там и правда просто c-функции в глобальный идут).

А вот код
Код:
namespace MyNameSpace{
char* strcat(const char* s1,const char* s2) {
// ...
}
}

int main()
{
// ...
char *c=MyNameSpace::strcat(a,b);
cout<<c;
return 0;
}
вызывает себе спокойно переопределённую версию. Зачем using-то?
« Последнее редактирование: 15-12-2008 13:57 от Вад » Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #11 : 16-12-2008 06:33 » 

после
using otnm::strlen
 компилятору без разницы что вызывать

так нефиг using писать
Записан

Странно всё это....
Mayor
Специалист

ru
Offline Offline

« Ответ #12 : 16-12-2008 11:49 » 

отписался в тех поддержку, оказалось это:

дубликат багов 38531 и 6257 g++

с версии g++ 4.2 iostream перестает инклудить cstring, но тем не менее все равно cstring продолжает инжектить глобальный namespace даже в версии 4.3

Записан

1n c0de we trust
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 16-12-2008 11:50 » 

Mayor1, а ты какой namespace хотел? Обратная совместимость Улыбаюсь
У MS инклудит за милую душу, если что. В 2008м Express в т.ч.
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #14 : 16-12-2008 13:42 » 

Mayor1Класс!
Записан

Странно всё это....
Mayor
Специалист

ru
Offline Offline

« Ответ #15 : 16-12-2008 16:48 » new

Mayor1, а ты какой namespace хотел? Обратная совместимость Улыбаюсь
У MS инклудит за милую душу, если что. В 2008м Express в т.ч.

ну типа глобальный namespace я полностью чистым хотел Улыбаюсь

с msvs уже полгода наверное не работал Улыбаюсь инклудит то пусть инклудит, а вот инжект это уже вата

да почитал про 6257, заявили об нем в 2002 году, года 3 обсуждали является ли g++ стандартом и является ли это багом, потом решили все работы по этому багу или особенности реализации подвесить до решения экспертной комиссии, в итого раза 2-3 в год кто-нить по незнанию снова его находит и как следствие цепочка дубликатов 6257  из года в год растет
Записан

1n c0de we trust
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines