강의에서는 생성자에서 다른 생성자를 호출하는식으로 코드를 작성하였습니다.
그런데, 호출되는 생성자의 코드를 똑같이 적어주는 방식으로하면 컴파일러가 버퍼오버런 경고를 띄어줍니다
그래서 std::vector, std::array, initializer_list, 정적배열 로 실험을 해보았는데,
벡터와 이니셜라이저리스트에서는 똑같은 경고를 띄어주더라구요..
이런 경고를 띄어주는 이유와, 해결 방법에 대해 질문합니다.
vs2019 , 디버그모드입니다.감사합니다
아래 코드를 첨부합니다. 코드를 긁어서 복사하시면
더 편하게 질문을 이해하실 수 있습니다.
//강의에서 사용된 코드
#include <initializer_list>
#include <vector>
#include <array>
class My_array
{
private:
unsigned m_length = 0;
int* m_ptr = nullptr;
public:
My_array()
{}
My_array(const unsigned& length)
{
m_length = length;
m_ptr = new int[m_length];
}
My_array(const std::initializer_list<int>& list)
//:My_array(list.size())
{ //생성자를 호출하지않고 생성자와 똑같은 코드를 적어줌
m_length = list.size();
m_ptr = new int[m_length];
unsigned i = 0;
for (const auto& e : list)
{
m_ptr[i] = e;
++i;
}
}
};
//여기서부터 실험 코드
void print(int* ptr);
int main()
{
//동적 할당을 받은후 정적배열의 데이터들을 복사
int arr[]{ 1,2,3,4,5 };
const int length_arr = sizeof(arr) / sizeof(arr[0]);
int* ptr_arr = new int[length_arr];
unsigned i = 0;
for (const auto& e : arr)
{
ptr_arr[i] = e;
++i;
}
print(ptr_arr);
//동적할당을 받은후 std::array의 데이터들을 복사
std::array<int, 5> stdArr {1, 2, 3, 4, 5, };
int* ptr_stdArr = new int[stdArr.size()];
i = 0;
for (const auto& e : stdArr)
{
ptr_stdArr[i] = e;
++i;
}
print(ptr_stdArr);
//동적할당을 받은후 initializer list의 데이터들을 복사
auto list={ 1,2,3,4,5 };
int* ptr_list = new int[list.size()];
i = 0;
for (const auto& e : list)
{
ptr_list[i] = e;
++i;
}
print(ptr_list);
//동적 할당을 받은후 벡터의 데이터들을 복사
std::vector<int> my_vec{ 1,2,3,4,5 };
int* ptr_vec = new int[my_vec.size()];
i = 0;
for (const auto& e : my_vec)
{
ptr_vec[i] = e;
++i;
}
print(ptr_vec);
return 0;
}
void print(int* ptr)
{
for (unsigned i = 0; i < 5 ;++i)
{
cout << ptr[i] << " ";
}
cout << endl;
}