소개
게시글
질문&답변
Buffer overrun 관련해서 질문드립니다!
안녕하세요!일단 저는 VS2022 사용하고 있고 얼마전 stackoverflow를 찾아본 결과 vs에서 발생하는 일종의 버그라고 생각됩니다!https://stackoverflow.com/questions/64713842/any-way-to-avoid-warning-c6386-without-disabling-it-or-code-analysis-altogetherComplier explorer를 통해 gcc 등 컴파일러로 실행해봤는데 warning이 잡히지 않았습니다!VS code analyzer가 위 코드의 list.size()가 0보다 큰 지 확실하게 판단하기 어려워서 해당 버그가 발생하는것으로 추정됩니다!이를 max(list.size(), 0)을 사용한 트릭으로 없앨 수는 있다고는 하는데 근본적인 해결책은 정확히 모르겠네요.
- 0
- 2
- 425
질문&답변
cout<<mon 질문
교수님께서 Position header안에 Position2D class에 대해서도 다시 한번 확인해 보시면 이해하실 거예요!
- 0
- 2
- 223
질문&답변
<< 오버로딩 시 const 유무에 따른 문제
d++의 경우Digit operator ++ (int){Digit temp(m_digit);++(*this);return temp;}에서 반환하는 값은 기본적으로 rvalue입니다. pointer나 reference 반환을 하지 않는 이상 함수를 호출한 expression에 return by value가 rvalue로 "잠시" 대체 되는 것입니다. d++앞에 주소를 확인하기 위해 &를 붙여보면 rvalue임을 확인할 수 있습니다.rvalue의 경우에는 함수 parameter가 reference로 받을 때(pass by reference)는 const를 꼭 붙여주어야 합니다. 따라서 const reference는 rvalue의 수명을 연장시켜 준다고 합니다. 이와 관련해서는 아래링크를 통해 확인할 수 있습니다! https://stackoverflow.com/questions/36102728/why-is-it-allowed-to-pass-r-values-by-const-reference-but-not-by-normal-referenc?newreg=af09de2f1d8d479ca830d2af2a5cb732
- 0
- 2
- 216
질문&답변
후위 연산자에서 this가 아닌 다른 인스턴스에 왜 주소가 아닌 값을 넘겨주면 안되나요?
Digit& operator ++ (int) { Digit temp(m_digit); ++(*this); return *temp; }함수 안에서 정의된 temp라는 instance의 scope는 함수 내부가 됩니다. 함수를 벗어나게 되면 소멸하게 되는 거죠. reference로 반환을 하려면 원본이 존재해야하는데 함수 밖을 나가면 사라지는 temp를 return by reference하면 reference는 원본을 찾을 수 없습니다.
- 0
- 2
- 179
질문&답변
초급한 질문이라 죄송합니다.
윗 분 말씀처럼 rvalue와 관련이 있습니다.-cents는 Cents(-m_cents)를 return하는데 이건 익명 객체이죠. 익명 객체(Cents(10) 등)는 rvalue로 여겨지는데 함수로 pass rvalue를 하려면 parameter는 const reference만 가능합니다.rvalue를 왜 const reference로만 받아야 하는가에 대해서는 아래 링크에 설명되어있습니다.https://stackoverflow.com/questions/36102728/why-is-it-allowed-to-pass-r-values-by-const-reference-but-not-by-normal-referenc?newreg=af09de2f1d8d479ca830d2af2a5cb732한 가지 예시가 나오는데void display(int& a) { a = 10 };display(1);가 있다면 말 그대로 a = 10은 rvalue에 rvalue를 넣으라는 말입니다. 말이 안되죠.따라서 질문자님이 말씀하신 reference만 사용할 수 없습니다그럼 왜 const가 이 역할을 하는가는 c++의 feature로 인한것 같습니다.Q1: Is the following code legal C++?// Example 1string f() { return "abc"; }void g() {const string& s = f(); cout }A1: Yes.This is a C++ feature… the code is valid and does exactly what it appears to do.Normally, a temporary object lasts only until the end of the full expression in which it appears. However, C++ deliberately specifies that binding a temporary object to a reference to const on the stack lengthens the lifetime of the temporary to the lifetime of the reference itself, and thus avoids what would otherwise be a common dangling-reference error. In the example above, the temporary returned by f() lives until the closing curly brace. (Note this only applies to stack-based references. It doesn’t work for references that are members of objects.)Does this work in practice? Yes, it works on all compilers I tried (except Digital Mars 8.50, so I sent a bug report to Walter to rattle his cage :-) and he quickly fixed it for the Digital Mars 8.51.0 beta).Q2: What if we take out the const… is Example 2 still legal C++?// Example 2string f() { return "abc"; }void g() {string& s = f(); // still legal? cout }A2: No.The "const" is important. The first line is an error and the code won’t compile portably with this reference to non-const, because f() returns a temporary object (i.e., rvalue) and only lvalues can be bound to references to non-const.요약하자면 const reference는 temporary object(rvalue)의 수명을 연장시켜 준다고 합니다. reference로만 받았을 때는 그 수명이 해당 expression에만 머물러 문제가 발생합니다.덕분에 저도 찾아보면서 많은 공부가 되었습니다!혹시 잘못된 내용있으면 답변으로 수정 부탁드립니다.
- 0
- 5
- 247
질문&답변
생성자 우선순위에 관한질문
안녕하세요! 저도 1번 질문과 비슷한 의문이 들어 디버거를 찍어봤는데요!안소님이 말씀하신거랑 조금 다른거 같아 답변 남깁니다!(안소님의 정성스러운 답변으로 항상 많이 배우고 있습니다ㅎㅎ)#include #include #include using namespace std;class B{private: int m_b;public: B(const int& m_b_in) : m_b(m_b_in) {}};class Something{ // 생성자가 없을시 여기서 init // 있으면 거치지 않음private: int m_i = 100; double m_d = 100.0; char m_c = 'F'; int m_array[5] = {100, 200, 300, 400, 500}; B m_b{ 1024 }; public: Something() : m_i(1) , m_d(3.14) , m_c('a') , m_array{1, 2, 3, 4, 5} , m_b(m_i - 1) { m_i = 2; m_d = 6.28; m_c = 'b'; } // 순서는 위에서 아래로. void print() { cout for (auto& element : m_array) cout cout }};int main(){ Something smth; smth.print(); return 0;}저의 경우 Something 생성자 m_i(1)에 디버거가 위치해 있을 때 m_i에 쓰레기 값이 들어있었습니다!이로 추정해 본 바, 멤버(private부분) 초기화를 거치지 않고 생성자에 들어왔을 때 초기화가 되는 것으로 생각하는 것이 맞다고 생각했습니다. 추가로 궁금해진 사항은 '그럼 생성자 이니셜라이져리스트 다음 중괄호 안에 내용은 초기화인 것인가?'라는 의문이 들었는데요. 교수님께서 직접 보여주셨듯이 { m_i *= 2; m_d *= 2.0;}와 같은 산술 연산이 가능한 것을 보아 초기화가 아닌 것으로 추정됩니다. 혹시 제 생각이 잘못되었다 하시면 답변으로 수정 부탁드립니다!
- 0
- 2
- 332
질문&답변
extern 선언
저도 이점이 궁금해서 stackoverflow를 찾아봤습니다!https://stackoverflow.com/questions/2190919/mixing-extern-and-constUm, since const s are implicitly static, you need an extern even on the a_global_var definition (in file.c). Without this, anything that includes file.h will not link because it is looking for a const int a_global_var with external라는 답변이 있었는데 제가 이해한 바를 설명드리겠습니다!위 글에서 const 키워드가 암묵적으로 static 으로 인식돼서 const를 같이 사용할 때는 extern을 사용하여 명시적으로 전역변수임을 나타내 주어야 하는거 같습니다..! 그래서 말씀하신 cpp파일에서 header를 빼면 extern이 없을 경우 const 포함 변수는 static이고 따라서 main.cpp 등 다른 cpp파일에서는 알 수 없는 상태가 됩니다. 결론적으로 const를 통해 정의하실 때는 extern을 통해 명시해주는 것이 필요합니다>!혹시 틀린 내용이 있으면 댓글로 정정 부탁드립니다ㅜ
- 1
- 2
- 303