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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2011, 17:34   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
Восклицание Различие результатов в MinGW и VS 2010

Вот такой, казалось бы, безобидный код:
Код:
#include <iostream>
#include <cstdlib>

int main()
{
     char* s = new char[256];
     if ( !s ) return 1;

     s = const_cast<char*>("Hello World");

     std::cout << s << std::endl;

     delete[] s;

     system("pause");

     return 0;
}
MinGW его с радостью компилирует и запускает, всё работает без ошибок. Однако в VS++ 2010 (хоть и запускает), сразу получаю ошибку

Почему ж так?

P.S.
И - да, кстати. Вот такой код отлично выполняется в VS. Но даже не компилируется в MinGW.
Код:
char* s = new("Hello World") char[256];
_-Re@l-_ вне форума Ответить с цитированием
Старый 10.12.2011, 17:40   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

безобидный код?
1)у вас потерян указатель на char[256]
2)вы пытаетесь освободить память занимаемую константным литералом, что нельзя.
кстати, в студии запустите без отладки.
а gcc просто в итоге проскакивает это.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.12.2011, 18:16   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2_-Re@l-_
Цитата:
И - да, кстати. Вот такой код отлично выполняется в VS. Но даже не компилируется в MinGW.
а ты понимаешь, что ты делаешь? пытаешься вызвать placement new, передав константный литерал в качестве области, где нужно выделить память.
ну напиши
Код:
char* s = new(const_cast<char *>("Hello World")) char[256];
g++ это скомпилет. но толку то что? код так и остался невалидным.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 10.12.2011, 18:28   #4
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
1)у вас потерян указатель на char[256]
Если его прицепить, вапше компилироваться не будет
Цитата:
2)вы пытаетесь освободить память занимаемую константным литералом, что нельзя.
Да, вот это не заметил. Исправил как
Код:

#include <iostream>
#include <cstdlib>
#include <cstring>

int main()
{
     char* s = new char[256];
     if ( !s ) return 1;

     strcpy(s,"Hello World");

     std::cout << s << std::endl;

     delete[] s;

     system("pause");

     return 0;
}
Теперь вроде ништяк.
Цитата:
а ты понимаешь, что ты делаешь? пытаешься вызвать placement new, передав константный литерал в качестве области, где нужно выделить память.
Ну, да... Логично вообще-то. Хотя я всегда считал, что параметр передаваемый оператору new(у меня это "Hello World") это то, чем инициализируется указатель(вернее, то на что он указывает).
_-Re@l-_ вне форума Ответить с цитированием
Старый 10.12.2011, 18:34   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Цитата:
Логично вообще-то
и что логичного в попытке перезаписи константного литерала?
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 10.12.2011, 19:07   #6
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

не зря же strcpy придумали, иначе все бы и пользовались '='
onewho вне форума Ответить с цитированием
Старый 10.12.2011, 20:44   #7
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
и что логичного в попытке перезаписи константного литерала?
Я не про то. Я про то, что логично
Цитата:
передав константный литерал в качестве области, где нужно выделить память.
_-Re@l-_ вне форума Ответить с цитированием
Старый 10.12.2011, 21:35   #8
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

_-Re@l-_

MinGW его с радостью компилирует и запускает, всё работает без ошибок. Однако в VS++ 2010 (хоть и запускает), сразу получаю ошибку

Очевидно, в MinGW есть какая-то встроенная защита от быдло-программеров, которые пытаются удалить память, которую они не выделяли. o_0
Rififi вне форума Ответить с цитированием
Старый 10.12.2011, 21:42   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Очевидно, в MinGW есть какая-то встроенная защита от быдло-программеров, которые пытаются удалить память, которую они не выделяли. o_0
студия в режиме релиза поступает так же.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Различие заданий girkoff Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 01.06.2010 13:09
Различие специальностей Syltan Свободное общение 8 28.05.2010 23:47
Набрать номер по модему. Различие в реализации кода Delphi 2007 и 2010. plato Общие вопросы Delphi 8 06.04.2010 09:47
В чем различие? Lunex.08 Свободное общение 5 30.10.2009 18:27