dev에선 잘되고 visual에선 컴파일은 되는데 실행파일 실행시키면 std::bad allo이라고 뜨는데 어떻게 해결해야할까요?
글쓴이: salmon16 / 작성시간: 토, 2020/05/02 - 8:30오후
#include<iostream> #include<string> #include<cstring> using namespace std; class MyString { char* str ; int size ; public: MyString( char* _str) :size(strlen(_str)),str(new char[size]){ for( int i = 0; i < size; i++) { str[i] = _str[i]; } } MyString() { str = NULL; size = 0; } MyString(const MyString& another) :size(another.size), str(new char[another.size]) { for ( int i = 0; i < size; i++) { str[i] = another.str[i]; } } void set(char * _str){ size = strlen(_str); str = new char[size]; for ( int i = 0; i < size; i++) { str[i] = _str[i]; } } int isEqual(const MyString& target)const { if (strcmp(str,target.str) == 0) return 1; else return 0; } void print()const { for ( int i = 0; i < size;i ++) { cout << str[i]; } cout << endl; } ~MyString() { delete str; } } ; int main() { MyString strs[] = { MyString("C"), MyString(), MyString("Java") } ; strs[1].set("C++") ; const MyString target("Java") ; for ( int i = 0 ; i < 3 ; i ++ ) { const MyString str(strs[i]) ; if ( str.isEqual(target) ) { cout << "[" << i << "]: " ; str.print() ; break ; } } for ( int i = 0 ; i < 3 ; i ++ ) { const MyString& str = strs[i] ; str.print() ; } } 이 코드인데 어디서 오류가 발생한걸까요?
Forums:
해법: size와 str 선언 줄 바꾸기
해법: size와 str 선언 줄 바꾸기
C++ 초기화가 이런 식인데, 헷갈리면 그냥 생성자 안에서 초기화하세요.
그것은 바꿀수가 없습니다 ㅜ
그것은 바꿀수가 없습니다 ㅜ
생성자안에선 어떻게 또 초기화하나요?
생성자안에선 어떻게 또 초기화하나요?
class MyString {
생성자의
size(strlen(_str)),str(new char[size])
부분에서 초기화가 진행되는 순서는 여기서 나열한 순서가 아니라 클래스 내부의 필드 선언 순서입니다.즉 str이 먼저 초기화되고 그 다음 size가 초기화되는 것이죠.
그런데 str을 초기화할 때 아직 초기화되지 않은 필드 size를 참조하고 있네요? bad alloc이 안 뜰 수가 없습니다.
클래스 내부에서 int size를 먼저 선언하도록 바꾸면 문제가 해결될 겁니다.
감사합니다
감사합니다
class MyString {
class MyString {
char* str;
int size;
public:
MyString(const char* _str) {
size = strlen(_str) + 1;
str = new char[size];
if (str)
for (int i = 0; i < size; i++) str[i] = _str[i];
} 이코드는 왜 실행이 되는걸까요?
생성자 body 내부의 statement들은 여느
생성자 body 내부의 statement들은 여느 다른 함수들에서와 마찬가지로 위에서부터 차례로 실행되기 때문이지요.
저는 개인적으로 가능한 한 ctor-initializer를 쓰는 편을 좋아합니다만, 뭐, 보아하니 굉장히 이상한 제약에 묶여 계신 것 같군요.
같은 답을 두 분이 하셨는데 이해하지 못하신 것
같은 답을 두 분이 하셨는데 이해하지 못하신 것 같네요.
원래 코드에서
:size(strlen(_str)), str(new char[size])
순서로 쓰셨는데, 이렇게 쓰셔도 초기화되는 순서는 size 다음에 str이 아니라 str이 먼저 초기화됩니다. 선언된 순서로str(new char[size])
이 먼저 실행된다는 뜻입니다. 모르시면 이상하게 생각하는 건 당연한데 C++ 스펙이 그렇게 생겼어요.위 코드처럼 생성자 안에서 그렇게 쓰면 쓴 순서대로 초기화되구요.
감사합니다.
감사합니다.
댓글 달기