C++ List사용중 발생한 오류에 대해 질문드립니다.

lyj4116의 이미지

사용하고 있는 코드는 다음과 같습니다

void DisplyManager::Random_OBJ_Setter()
{
	int x;
	int y;
	int objType;
	srand((unsigned int)time(NULL));
 
	GameObject *tempOBJ = NULL;
 
 
	for (int i = 0; i < 10; ++i)
	{//랜덤으로 3개의 값을 넣어 객체를 만들고
		x = (rand()) % X_LENGTH;
		y = (rand()) % Y_LENGTH;
		int objType = 30 + (rand() % 3);
 
		tempOBJ = new GameObject(x, y, (ObjectNumber)objType);
		if (tempOBJ != NULL) //객체가 정상적으로 생성되면 함수를통해 list에 객체를 추가합니다
			Add_gOBJ(*tempOBJ); //오류 발생
 
	}
}

위 코드에서 주석 "오류 발생"이 있는 함수는 다음과 같습니다.

void DisplyManager::Add_gOBJ(const GameObject& NEW_gOBJ)
{
 
//지금 들어온 객체가 첫 노드인지 확인합니다. 추후 쓸일이 있을까 싶어 이렇게 만들어놨습니다.
	if (gOBJ_LIST.empty()) 
	{
		cout << "gOBJ = empty" << endl;
		gOBJ_LIST.push_back(NEW_gOBJ);
	}
	else
	{
		cout << "gOBJ = Not empty" << endl; 
//첫 노드임에도 불구하고 empty = true에 걸리지 않고 해당 else문으로 들어옵니다
//혹시나 싶어for( GameObject g : gOBJ_LIST )를 통해 객체를 출력해봤지만 역시나 비어있습니다.
		gOBJ_LIST.push_back(NEW_gOBJ);
//그 상태에서 list.push_back을 실행하면 사진1과 같은 오류가 확인됩니다.
	}
}

사진1의 위쪽 화면은 디버깅을 통해 버그가 확인되는 지점, 버그 메시지이고
밑의 콘솔화면은 실행결과입니다. "gOBJ = Not empty"를 제외한 메시지는 무시하시면 됩니다.

디버그시에 랜덤값이나 객체의 생성은 문제가 없음을 확인했습니다.
하나 자꾸 여기서 걸려서 한참을 정체되어있습니다. std::list의 구조를 잘 파악하고있지 못하고있고, 코드를 봐도 제 수준에는 이해하기 너무나 난해하여 어떻게 해야할지 너무 곤란한데 도와주시면 정말 감사드리겠습니다...

File attachments: 
첨부파일 크기
Image icon 사진125.09 KB
익명 사용자의 이미지

gOBJ_LIST가 어떻게 선언/정의되었는지, 초기화는 적절히 되었는지 보여주세요.

보통 이런 문제는 없어야 정상이지만, 현재 보여주신 코드에서 엿보이는 질문자의 C++ 숙련도가 높지 않아보여서 염려가 되는군요. 확인해 봐야지요.
예컨대,

(1) new는 할당이 실패했을 때 조용히 NULL 포인터를 반환하지 않습니다. std::bad_alloc 예외를 던집니다. 이걸 잡아서 처리해 줘야 합니다.
std::bad_alloc을 던지지 않고 NULL 포인터를 반환하게 만들려면 std::nothrow를 넘겨 new 해야 합니다.

(2) tempOBJ에 할당된 객체는 해제되지 않아서 메모리가 줄줄 샙니다.
스마트 포인터(std::unique_ptr 등)를 쓰거나, 아니면 직접 해제해 줘야 합니다.

lyj4116의 이미지

열심히 질문 내용을 읽어주시고, 고심히 생각하신 결과를 말씀해주셔서 대단히 감사합니다.
그런데 뜬금없이 혼자서 계속 고민하던 중에 위의 코드가 아닌 다른 코드를 고쳤는데 갑자기 프로그램이 제대로 돌아가기 시작했습니다. 달리 말하자면, 위 메소드들은 모두 정상적으로 자신의 일을 수행합니다.
디버깅을 통해, 출력을 통해 확인하였습니다!

뭘 고쳐서 어디가 잘 돌아가기 시작한건지 파악하기가 어려워 질문 자체의 의미가 없어져버린 것 같아 댓글 작성자님께서 요구하신 내용을 따로 첨부하기 어려울 것 같습니다.

그래도 (1)은 제가 몰랐던 내용, (2)는 제가 알고있었으나 깊게 생각하고있지 않던 부분이었습니다.
어찌됐던간에 제 형편없는 코드내용 보시면서 고심하신 끝에 조언 해주신 것 정말 대단히 감사드립니다.
언급해주신 내용 토대로 앞으로의 코딩에 유념하고, 메모리 관리에 철저하겠습니다. 답변해주셔서 감사합니다!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.