-
[기본] C# 간단한 질문입니다2015.10.17 AM 07:40
간단하지만 쉽지 않을 것 같습니다
대충 상황을 요약하면 다음과 같은데요
List
for( int i=0 ; i<2 ; i++ )
{
int [] intarray = new int [3];
intarray[0] = 1;
intarray[1] = 12;
intarray[2] = 123;
listofarray.Add( intarray );
Debug.Log( listofarray[0][0] );
}
Debug.Log( listofarray[0][0] );
저는 이 코드에서 로그가 세번다 1 이 찍히길 원하지만
루프 안에서는 1 이 제대로 찍히지만 마지막껀 deep copy 가 되지 않아 이상한 값, 그것도 3(!) 이 찍힙니다
(이상하게 array 의 사이즈가 찍히더라구요)
여기서 Add 할때 new int [] 같은걸 써서 deep copy 를 하고 싶은데 어떻게 하면 될까요
C++ 에서는 고급 내용에서 비슷한 것을 공부했었는데
C# 은 고급 문법을 몰라서 어떻게 해야될지 전혀 모르겠네요
아니면 처음 intarray 를 new 로 할당할때 자동으로 가비지컬렉팅되는걸 막아서 해결할 수도 있을 것 같고
어쨌든 여기서만 메모리를 할당하는 간단한 시뮬레이션 프로그램이라 메모리는 하나도 해제 안되고 막 다 누출되도 되는데
해결법 아시는분은 가르쳐주시면 감사하겠습니다!
댓글 : 7 개
- 메케메케
- 2015/10/17 AM 08:19
이상해서 저도 함 해봤는데요, 1이 잘 찍혀요. ㅡㅡ;
확인 겸 따로 스크립트를 만들어서 저 문만 실행해 보셨나요? 아마 다른데서 3을 넣고 있는게 아닐까 싶은데요.
확인 겸 따로 스크립트를 만들어서 저 문만 실행해 보셨나요? 아마 다른데서 3을 넣고 있는게 아닐까 싶은데요.
- NuguriX
- 2015/10/17 AM 08:22
이게 실제 코드인가요?? 이코드는 문제가없어보이는데요.
루프에서 리스트에서 add 하는 코드는 딥카피같은 문제랑은 별개인거 같습니다. C++에서 객체포인터만 넘어가는 거랑 같은 코드인걸요
루프에서 리스트에서 add 하는 코드는 딥카피같은 문제랑은 별개인거 같습니다. C++에서 객체포인터만 넘어가는 거랑 같은 코드인걸요
- 몬스터.[
- 2015/10/17 AM 08:30
저도 처음 설명보고 주소만 넘겨서 날라가나보다했는데 비주얼스튜디오에서 돌려보니
메모리는 정상적으로 들어가있네요
컴파일러 차이인지 올리신 코드외로 더 있는건지 알수없는 문제네요
메모리는 정상적으로 들어가있네요
컴파일러 차이인지 올리신 코드외로 더 있는건지 알수없는 문제네요
- 메케메케
- 2015/10/17 AM 08:45
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
public class gg {
void Start ()
{
int[] intarray = {0,1,2,3};
int [] intarray2;
intarray2 = DeepClone (intarray);
intarray2 [1] = 333;
Debug.Log (intarray [1]);
Debug.Log (intarray2 [1]);
}
public static T DeepClone<T>(T obj)
{
using (var ms = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(ms, obj);
ms.p-osition = 0;
return (T) formatter.Deserialize(ms);
}
}
}
using System.IO;
public class gg {
void Start ()
{
int[] intarray = {0,1,2,3};
int [] intarray2;
intarray2 = DeepClone (intarray);
intarray2 [1] = 333;
Debug.Log (intarray [1]);
Debug.Log (intarray2 [1]);
}
public static T DeepClone<T>(T obj)
{
using (var ms = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(ms, obj);
ms.p-osition = 0;
return (T) formatter.Deserialize(ms);
}
}
}
- 메케메케
- 2015/10/17 AM 08:47
이거 맞나요? 전 초보라서 그냥 구글 보고 카피해서 만들었어요.
MemberwiseClone을 쓰는 다른 방법들도 있다고 하네요.
http://stackoverflow.com/questions/129389/how-do-you-do-a-deep-copy-an-object-in-net-c-specifically
MemberwiseClone을 쓰는 다른 방법들도 있다고 하네요.
http://stackoverflow.com/questions/129389/how-do-you-do-a-deep-copy-an-object-in-net-c-specifically
- puchikon
- 2015/10/17 AM 09:01
딴거하느라 이제야 확인했네요
답변 주신분들 정말 감사합니다
실제 코드는 저게 아니라 훨씬 복잡한데 문제되는 부분만 간단하게 만들어서 올렸는데
그래서 여기서는 잘 찍히나보네요
아니면 저는 유니티로 개발하고 있어서 그런걸수도 있는데 어쨌든 원칙적으로는 저 scope 넘어가면 데이터 생사를 보장할 수 없나봐요
메케메케님의 코드로 한번 해보겠습니다
답변 주신분들 정말 감사합니다
실제 코드는 저게 아니라 훨씬 복잡한데 문제되는 부분만 간단하게 만들어서 올렸는데
그래서 여기서는 잘 찍히나보네요
아니면 저는 유니티로 개발하고 있어서 그런걸수도 있는데 어쨌든 원칙적으로는 저 scope 넘어가면 데이터 생사를 보장할 수 없나봐요
메케메케님의 코드로 한번 해보겠습니다
- 마나풀
- 2015/10/19 AM 10:43
http://csharppad.com/gist/87ab2d951bcfb926f4c8
실행해봤는데 문제 없이 1이 3번 찍힙니다.
실행해봤는데 문제 없이 1이 3번 찍힙니다.
user error : Error. B.