Конструкторы ведут себя странным с кодом обработки исключений -- c++ поле с участием visual-c++ поле с участием exception-handling поле с участием constructor пол Связанный проблема

Constructors behaving strange with exception handling code


-2
vote

проблема

русский

Скриншот # 1: Образец (образец & amp;) {...) // Нет ошибки без использования "const" Введите описание изображения здесь Скриншот № 2: Destructor называется дважды, когда Copy-Constructor не включен. Введите описание изображения здесь

Когда я запускаю этот код в VC ++ 2010, я нашел результаты с уверенностью, пожалуйста, посмотрите:

 <код> #include <iostream> using namespace std;  class Sample { public:    Sample() { cout<<"Sample(). "; }    // Sample (Sample&) { cout<<"Sample(Sample&). "; }    ~Sample() { cout<<"~Sample(). "; } };  void fx() {    throw Sample(); }  int _tmain(int argc, _TCHAR* argv[]) {    try { fx(); }    catch (Sample&) { cout<<"Caught Sample. "; }    return 0; }   

Пожалуйста, сообщите, почему, не включающее в себя копирование-конструктор в примере, деструктор называется дважды. И имея так, вызывает прервать (), если мы освободим кучу в деструктора, например.

Также я знаю, что копия объекта создана из объекта бросания, но почему он не вызывает Copy-Constructor для этого.

Пожалуйста, смотрите прилагаемый экран снятым для кода и вывода.

Английский оригинал

ScreenShot #1: Sample(Sample&) {...) // No Error without using "const" enter image description here ScreenShot #2: Destructor is called twice, when copy-constructor is not included. enter image description here

When I run this code in VC++2010, I found results surprizing, please have a look:

#include <iostream> using namespace std;  class Sample { public:    Sample() { cout<<"Sample(). "; }    // Sample (Sample&) { cout<<"Sample(Sample&). "; }    ~Sample() { cout<<"~Sample(). "; } };  void fx() {    throw Sample(); }  int _tmain(int argc, _TCHAR* argv[]) {    try { fx(); }    catch (Sample&) { cout<<"Caught Sample. "; }    return 0; } 

Please tell why without including copy-constructor in example, destructor is being called twice. And having so causes Abort() if we're freeing heap in destructor for example.

Also I know that a copy of object is created of the throwing object, but why it is not calling copy-constructor for that.

Please see the attached screen shot for code and output.

</div
           
         
         

Список ответов

2
 
vote

Это, кажется, является ошибкой (функция? :)) в компиляторе VC ++, который на некоторое время находится вокруг (у меня нет никаких ссылок для поддержки этого оператора напрямую, и у меня нет времени, чтобы продолжать поиск. Я думаю, что я столкнулся с этим или в два раза больше.) Это все еще происходит в VC ++ 2012.

Это хорошая практика кодирования, чтобы всегда определить Copy Ctor, даже если вы не используете его. Это часть Правило трех . Хотя есть предостережения.

  1. vc ++ будет использовать контекст объекта, а не вызывающего абонента при попытке выполнить копию CTOR при броске. Итак, даже если помечены приватному, это все равно будет доступно. Это, вероятно, наследие, хотя я не могу найти ничего конкретного для этого факта.

  2. vc ++ позволит копию CTOR с параметрами Non-const при броске. Это также наследие, чтобы разрешить смещение ресурсов вокруг до реализации парадигмы перемещения. Я нашел несколько вещей смутно в том числе к этому. И нет, VC ++ не отображается, не использует парадигму перемещения для бросания объектов, чтобы это все еще происходит, если вы попытаетесь реализовать конструктор движения.

Для получения дополнительной информации о конструкторе движения вы можете увидеть Здесь .

Обратите внимание, что Microsoft кажется вишневым выбором, какую часть стандарта C ++ он будет реализовывать на основе, если он сломает слишком много вещей. По этой причине я не думаю, что хотел бы быть в команде Dev Compiler в M $. : /

 

This appears to be a bug (feature? :) ) in the VC++ compiler which has been around for a while (I do not have any links to support this statement directly however and I don't have time to keep searching. I think I have come across this one or twice myself though.) This still occurs in VC++ 2012.

It is good coding practice to always define a copy ctor, even if you don't use it. This is part of The Rule of Three. There are caveats though.

  1. VC++ will use the context of the object not the caller when trying to execute the copy ctor when throwing. So even if marked private it will still be accessible. This is probably a legacy thing though I can't find anything specific to that fact.

  2. VC++ will allow for a copy ctor with a non-const param when throwing. This is also legacy to allow for shifting of resources around prior to the implementation of the move paradigm. I only found a few things vaguely eluding to that. And no, VC++ does not appear to use the move paradigm for throwing objects so this still occurs if you try and implement the move constructor.

For more info on the move constructor you can see here.

Please note that Microsoft seems to cherry pick what part of the C++ standard it will implement based on if it will break too many things. For this reason, I don't think I'd want to be on the compiler dev team at M$. :/

</div
 
 
 
 

Связанный проблема

145  Как определить, является ли строка номер с C ++?  ( How to determine if a string is a number with c ) 
У меня было довольно неприятностей, пытаясь написать функцию, которая проверяет, является ли строка номер. Для игры, которую я пишу, мне просто нужно проверит...

3  Как создавать закрытые зоны (выпуклые многоугольники) от набора сегментов линии?  ( How to create closed areas convex polygons from set of line segments ) 
Следующая проблема находится в 2D, поэтому некоторые упрощения могут быть сделаны при предложении ответов. Мне нужно создать закрытые области (определены ли...

14  Классы, Rvalues ​​и Rvalue Список  ( Classes rvalues and rvalue references ) 
Lvalue - это значение, связанное с окончательной областью памяти, тогда как rvalue - это значение выражения, существование которого является временным, а не о...

-1  C ++ DO В то время как проблемы с петлей [закрыто]  ( C do while loop issues ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> <Путь d = "M15 6.38A6.48 6.48 0 007.78. 04H-.02A6.49 6.49 0 002.05 ...

-1  Приложение C ++ в массивах с использованием арифметического указателя  ( C app on arrays using pointer arithmetic ) 
Вопрос: как я могу генерировать случайное животное из массива, используя эту функцию? <код> const int MAX =12; //12 animals const int MAXSTR = 10; ...

1  Как работают Char и INT в C ++  ( How do char and int work in c ) 
Может быть, я собираюсь задать глупый вопрос, но я хочу подтвердить, как работает Char? Позвольте мне объяснить с примерами того, что я хочу спросить. Пусть п...

1  Наличие проблемных проектов C ++ в Eclipse CDT в ОС X для глупой причины  ( Having trouble building c project in eclipse cdt in os x for a silly reason ) 
Я пытаюсь построить очень простую программу C ++ в Eclipse, и я получаю очень глупую ошибку: <код> **** Internal Builder is used for build **...

29  Добавление! Оператор и SQRT (), POW () и т. Д. Для пример примерка калькулятора  ( Adding the operator and sqrt pow etc to a calculator example applicatio ) 
Я делаю упражнения в новой книге Strustrup "Принципы программирования и практики с использованием C ++" и было интересно, если кто-нибудь на переполнении ст...

0  Как захватывать события, выпущенные из нового окна всплывающего  ( How to capture events fired from new popup ie window ) 
Приветствия! <Сильная> Ситуация: My ActiveX DLL содержит индивидуальный webbrowser. WebBrowser отображает веб-страницу. Когда пользователь нажимает на сс...

4  Строка :: Новая: что это?  ( Stringnew what is it ) 
Я из фона Java и изучает C ++. Я столкнулся с следующим C ++: <код> String source = String::New("'Hello' + ', World'"); Как то, что я так понимаю, это ...

3  Преобразование IPlimage в вектор в 1D в OpenCV  ( Converting iplimage into 1d vector in opencv ) 
Я хочу преобразовать MXN IPLIMAGE в вектору A (M * N) x 1 1. Может ли это сделать с любой функцией в OpenCV? Любая помощь значительно ценится. ...

1  Проблема с использованием TextureView с NDK  ( Issue using textureview with ndk ) 
Я работаю над небольшим кусочком кода, используя текстуру, чтобы отобразить результат среды MediaPlayer. Я сталкиваюсь с проблемой, пытающимся смешивать упр...

-4  Петля, которая компилирует и работает в INT основной функции не скомпилируется при введении в отдельную функцию [закрыто]  ( Loop that compiles and runs in int main function wont compile when put into a se ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыто. Этот вопрос нуждается в Детали отладки . В настоящее вр...

3  Отправка HTTP Post Запрос на обновление содержимого файла с использованием C ++ REST SDK Casablanca  ( Sending a http post request for updating file contents using c rest sdk casabl ) 
Я пытаюсь обновить содержимое файла на сервере Alfresco, используя C ++ SDK SDK. Я использую URL Alfresco CMIS URL для отправки запроса. Быть более конкретным...

29  C ++ Указатель на объекты  ( C pointer to objects ) 
в C ++ У вас всегда инициализировать указатель на объект с new ключевое слово? или вы просто имеете это тоже: <код> MyClass *myclass; myclass->DoSometh...

Связанный проблема

145  Как определить, является ли строка номер с C ++? 
3  Как создавать закрытые зоны (выпуклые многоугольники) от набора сегментов линии? 
14  Классы, Rvalues ​​и Rvalue Список 
-1  C ++ DO В то время как проблемы с петлей [закрыто] 
-1  Приложение C ++ в массивах с использованием арифметического указателя 
1  Как работают Char и INT в C ++ 
1  Наличие проблемных проектов C ++ в Eclipse CDT в ОС X для глупой причины 
29  Добавление! Оператор и SQRT (), POW () и т. Д. Для пример примерка калькулятора 
0  Как захватывать события, выпущенные из нового окна всплывающего 
4  Строка :: Новая: что это? 
3  Преобразование IPlimage в вектор в 1D в OpenCV 
1  Проблема с использованием TextureView с NDK 
-4  Петля, которая компилирует и работает в INT основной функции не скомпилируется при введении в отдельную функцию [закрыто] 
3  Отправка HTTP Post Запрос на обновление содержимого файла с использованием C ++ REST SDK Casablanca 
29  C ++ Указатель на объекты