Тема: Програма викликає відладчик. Може туплю, може не не розумію, загадка я
З новим роком, що настав, усіх! Всім клльового продовження свята, встстреч з друзями, і більше слухати рідну мову!
Програма викликає відладчик. Може туплю, може не не розумію, загадка якась! Не можу!
Це, я вже не перший день не можу зрозуміти, що у мене в коді! Начебто і працює майже як належить, але програма, скомпільована в ДЕВ-С ++
клікає відладчик, на моїй машині це зокрема ІДА, пише в консоль нормально,але завершується з кодом -3887352130 ......
Я вже сто разів дивився на код ... Та ничого такого! Ничого взагалі я не бачу, ото щоб могло таке спричінити!
Я стало бути щось дуже не розумію .. Я пробував налагоджувати з кодеблок- я й кодеблок не дуже вправно володію, може тому й не зрозумів також ничого.
Здається щось негарне трапляється коли код доходить до рядка 31 knot = headline1;
Відповідно викликається в дію
StringBad& StringBad::operator=(const StringBad& st)
{
if (this==&st)return *this;
len=st.len;
delete [] str;
str=new char(len+1);
std::strcpy(str, st.str); // initialize pointer вгнати значення
std::cout << "StringBad& StringBad::operator=(const StringBad& st) this "<< this << " *this "<< *this << " st " << st << " &len "<< &len << std::endl;
return *this;
}
Прямо щось таємниче відбувається, містика якась, я взагалі не зрозумів, може причина якась проста, але я не зрозумію ось.
Я знаю що я можу плутати що завгодно і де завгодно!
Нижче повний код як він зараз та послання на цілісний проект як він був пару днів тому (взагалі те ж саме)
// strngbad.cpp -- StringBad class methods
#include <cstring> // string.h for some
#include "strngbad.h"
using std::cout;
// initializing static class member
int StringBad::num_strings = 0; // ініціалізація статичного класового члена
// class methods
// construct StringBad from C string
StringBad::StringBad(const char * s)
{
len = std::strlen(s); // set size встановити розмір
str = new char[len + 1]; // allot storage виділити пам'ять
std::strcpy(str, s); // initialize pointer вгнати значення ні ініціалізувати покажчік
num_strings++; // set object count
cout << num_strings << ": \"" << str
<< "\" object created\n"; // For Your Information
std::cout << "StringBad::StringBad(const char * s) this "<< this << " s " << s << std::endl;
}
StringBad::StringBad() // default constructor
{
len = 0;
str = new char[1];
str [0]='\0'; // default string
num_strings++;
cout << num_strings << ": \"" << str
<< "\" default object created\n"; // FYI
std::cout << "StringBad::StringBad() this "<< this << std::endl;
}
StringBad::StringBad(StringBad& st)
{
len =st.len; // set size встановити розмір
str = new char[len + 1]; // allot storage виділити пам'ять
std::strcpy(str, st.str); // initialize pointer вгнати значення ні ініціалізувати покажчік
num_strings++; // set object count
cout << num_strings << ": \"" << str
<< "\" object created\n"; // For Your Information
std::cout << "StringBad::StringBad(StringBad& st) this "<< this << " st " << st << std::endl;
};
StringBad::~StringBad() // necessary destructor
{
cout << "\"" << str << "\" object deleted, "; // FYI
--num_strings; // required
cout << num_strings << " left\n"; // FYI
delete [] str; // required
std::cout << "StringBad::~StringBad() this "<< this << std::endl;
}
std::ostream & operator<<(std::ostream & os, const StringBad & st)
{
os << st.str;
return os;
}
StringBad& StringBad::operator=(const StringBad& st)
{
if (this==&st)return *this;
len=st.len;
delete [] str;
str=new char(len+1);
std::strcpy(str, st.str); // initialize pointer вгнати значення
std::cout << "StringBad& StringBad::operator=(const StringBad& st) this "<< this << " *this "<< *this << " st " << st << " &len "<< &len << std::endl;
return *this;
}
bool StringBad::operator<( const StringBad &st){
if (std::strcmp(str, st.str)>0)
return true;
else
return false;
}
bool StringBad::operator>(const StringBad &st){
return str< st.str;
}
bool StringBad::operator==(const StringBad &st){
std::cout << "bool StringBad::operator==(const StringBad &st) this "<< this << " *this "<< *this << " st " << st << " &len "<< &len << std::endl;
return (std::strcmp(str, st.str)==0);
}
char & StringBad::operator[](int i)
{
std::cout << "char & StringBad::operator[](int i) this "<< this << " *this "<< *this << std::endl;
return str[i];
}
// strngbad.h -- flawed string class definition
#include <iostream>
#ifndef STRNGBAD_H_
#define STRNGBAD_H_
class StringBad
{
private:
char * str; // pointer to string покажчік кудись
int len; // length of string длина чогось
static int num_strings; // number of objects число об'єктів
public:
StringBad(const char * s); // constructor
StringBad(); // default constructor
StringBad(StringBad& st);
~StringBad(); // destructor
// friend function
friend std::ostream & operator<<(std::ostream & os,
const StringBad & st);
StringBad & operator=(const StringBad & st);
bool operator<( const StringBad &st);
bool operator>( const StringBad &st);
bool operator==( const StringBad &st);
char& operator[](int i);
};
#endif
// vegnews.cpp -- using new and delete with classes
// compile with strngbad.cpp
#include <cstdlib>
#include <iostream>
using std::cout;
#include "strngbad.h"
void callme1(StringBad &); // pass by reference
void callme2(StringBad); // pass by value
int main()
{
using std::endl;
StringBad headline1("Celery Stalks at Midnight");
StringBad headline2("Lettuce Prey");
StringBad sports("Spinach Leaves Bowl for Dollars");
cout << "headline1: " << headline1 << endl;
cout << "headline2: " << headline2 << endl;
cout << "sports: " << sports << endl;
callme1(headline1);
cout << "headline1: " << headline1 << endl;
callme2(headline2);
cout << "headline2: " << headline2 << endl;
cout << "Initialize one object to another:\n";
StringBad sailor = sports;
cout << "sailor: " << sailor << endl;
cout << "Assign one object to another:\n";
StringBad knot;
knot = headline1;
cout << "knot: " << knot << endl;
StringBad Test("Test");
StringBad AnsverF("Lov");
//if ("Lov"==AnsverF){
// cout << "Tak " << endl;
//}
StringBad Mu("QWERTYUIOP");
cout << Mu[4] << endl;
cout << "End of main()\n";
system("pause");
return 0;
}
void callme1(StringBad & rsb)
{
cout << "String passed by reference:\n";
cout << " \"" << rsb << "\"\n";
}
void callme2(StringBad sb)
{
cout << "String passed by value:\n";
cout << " \"" << sb << "\"\n";
}
http://www.не-дійсний-домен/5646878
або
http://сайт-злодій/files/mybs9aklx