December 31, 2008

virtual 소멸자

 

상속하고 있는 클래스의 객체소멸시 문제점

  1. #include <iostream>
    using std::endl;
    using std::cout;
  2. class AAA {
        char* str1;
    public:
        AAA(char* _str1) {
            str1=new char[strlen(_str1)+1];
            strcpy(str1, _str1);
        }
        ~AAA() {        //virtual ~AAA()
            cout<<"~AAA() call!"<<endl;
            delete []str1;
        }
        virtual void showString() {
            cout<<str1<<' ';
        }
    };
  3. class BBB : public AAA {
        char* str2;
    public:
        BBB(char* _str1, char* _str2) : AAA(_str1) {
            str2=new char[strlen(_str2)+1];
            strcpy(str2, _str2);
        }
        ~BBB() {
            cout<<"~BBB() call!"<<endl;
            delete []str2;
        }
        virtual void showString() {
            AAA::showString();
            cout<<str2<<endl;
        }
    };
  4. int main(void) {
        AAA* a=new BBB("Good", "evening");
        BBB* b=new BBB("Good", "morning");
  5.     a->showString();
        b->showString();
  6.     cout<<"----객체 소멸 직전 ----"<<endl;
        delete a;
        delete b;
  7.     return 0;
    }

소멸자의 호출에 문제가 있다. 출력내용을보면 BBB클래스의 소멸자가 한번 덜 호출되었음을 볼 수 있다.
위의 예제에서는 AAA타입 포인터 a로 BBB객체를 가리키고 있다. 그리고 53번째 줄에서는 포인터 a를 통한 BBB객체의 소멸을 시도하고 있다. 여기서 바로 문제가 생긴 것이다. 왜냐하면 포인터 a가 가리키는 객체는 BBB객체이지만 AAA타입의 포인터로 가리키고 있기 때문에, 컴파일러는 BBB객체를 AAA객체로 인식한다. 따라서 AAA클래스의 소멸자만 호출이 되는 것이다.

AAA클래스의 소멸자도, BBB클래스의 소멸자도 동적으로 할당한 메모리 공간을 소멸시켜 주는 역할을 하게끔 정의되어 있기 때문에 객체소멸시에는 반드시 둘 다 호출되어야 한다. 하나라도 호출되지 않으면 메모리 유출(누수)이 발생하게 된다.

Virtual 소멸자

AAA클래스의 소멸자를 다음과 같이 변경한다.

  1. virtual ~AAA() {        //virtual ~AAA()
        cout<<"~AAA() call!"<<endl;
        delete []str1;
    }

일단 AAA클래스의 소멸자를 호출하려 든다. 그러나 소멸자가 Virtual인 관계로 Derived클래스의 소멸자를 호출하게 된다. 비록 함수의 이름은 다르지만, 둘 다 소멸자인 관계로 virtual함수를 오버라이딩했을 때의 현상이 그대로 적용되는 것이다. 그 다음 BBB클래스의 소멸자는 AAA클래스를 상속하고 있기 때문에 다시 AAA클래스의 소멸자가 호출된다. 결국 Derived클래스, Base클래스의 소멸자가 모두 호출이 된다.

 

이 글은 스프링노트에서 작성되었습니다.

December 26, 2008

Make Movable Control in Web using AjaxTookit

Ajaxtookit 을 사용하여 웹에서 드래그가 가능한 컨트롤을 만들수 있다.

하나하나 구현하려면 굉장히 많은 시간과 노력이 필요하겠지만 잘 만들어 놓은 Ajax Toolkit 을 이용하면 쉽게 구현할 수 있다.

 

우선 AjaxToolkit 를 설치해야한다.

1. 링크를 따라 (DllOnly)를 받으면 된다.

2. Visual Studio 의 도구모음에 탭을추가하여 받은 DLL 을 참조하면된다.

이렇게 하면 아래와 같이 사용 할 수 있다.

 

다음 단계는 이렇게 추가한 도구를 사용하여 드래그가 가능한 컨트롤을 만들어야한다. 도구상자에서 표준탭에서 Panel 를 추가하여 적당한 사이즈로 줄인다. 그리고 판낼 오른쪽 위에 > 이렇게 생긴것을 눌러주고 Extender 추가 를 누르면 그림과 같이 마법사가 하나 뜨고 DragPanelExtender 를눌러 확인을 누르게 되면

그 Panel 을 이제 움직 일 수 있게 된다. Panel 안에는 어떠한 컨트롤도 들어가니

자유롭게 만들 수 있을 것이다.

 

자세한 설명은 아래의 PPT 파일을 참고 하면된다.

 

 

 

웹과 데스크탑, 모바일을 넘나드는 사용자 경험, Live Mesh

 

Live Mesh

December 24, 2008

버퍼링 없는 동영상 재생!! Smooth Streaming

Smooth Streaming and Expression Encoder 2 SP1

 

Expression Encoder SP1 이 나오면서 여러가지 템플릿과 H.264 , Adaptive Streaming 등이 추가가 되었습니다.

 

Expression Encoder 2 SP1이 되면서 Smooth Streaming을 지원하게 되었는데요, 이것은 IIS7의 새로운 Extension 으로서 HTTP를 통해서 Silverlight 클라이언트로 Adaptive Streaming을 가능하게 해주는 것입니다.

 

Smooth HD라는 데모 사이트를 통해서 Smooth Streaming 서비스를 체험해 보시길 바랍니다. 서버가 국내에 있지 않아서 조금 끊길 수도 있는데요, 화질이 변화하는 것을 확인 하실 수 있을 것 같습니다. 예를 들면 시작하자마자 재생 바를 중간 정도로 끌어 놓으시면 화질이 조금 떨어진 상태로 재생이 되다가 조금 지나서 대역폭이 확보되면 고화질로 변하는 것을 보실 수 있습니다

 

현제 이서비스를 하려면 아직 더 기다려야 합니다.

IIS 7.0 Smooth Streaming

Expression Encoder 2 SP1 에서는 우선 지원을 하지만 이서비를 하기위해서는 IIS7 에서 제공하는 IIS 7.0 Media Pack 을 설치해야하는데 Smooth Streaming 은 내년 1분기에 베타버전으로 나올것으로 예상됩니다.

 

December 21, 2008

Cross doamin policy

clientaccesspolicy.xml

으로 파일을 저장하여 C:\Inetpub\wwwroot 에(서버) 복사시키면된다

 

<?xml version="1.0" encoding="utf-8"?>
<ACCESS-POLICY>
  <CROSS-DOMAIN-ACCESS>
<POLICY>
      <ALLOW-FROM http-request-headers="*">
        <DOMAIN uri="*" />
      </ALLOW-FROM>
      <GRANT-TO>
        <RESOURCE include-subpaths="true" path="/" />
      </GRANT-TO>
    </POLICY>
  </CROSS-DOMAIN-ACCESS>
</ACCESS-POLICY>

 

Check File Exsists in C#

using System.IO;

 

File.Exists(string filepath);

 

return 형은 bool 값이다.

December 20, 2008

Timer, Progressbar in Silverlight

public Page()  
{  
    InitializeComponent();  
 
    System.Windows.Threading.DispatcherTimer myDispatcherTimer = new System.Windows.Threading.DispatcherTimer();  
    myDispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 100); // 100 Milliseconds  
    myDispatcherTimer.Tick += new EventHandler(Each_Tick);  
    myDispatcherTimer.Start();  
}  
 
// Fires every 100 miliseconds while the DispatcherTimer is active.  
public void Each_Tick(object o, EventArgs sender)  
{  
    MediaProgress.Value = media.Position.TotalSeconds;  
}  
private void Play_Click(object sender, RoutedEventArgs e)  
{  
    media.Play();  
    MediaProgress.Maximum = media.NaturalDuration.TimeSpan.TotalSeconds;  
    //media.Position;  
}  
 
private void pause_Click(object sender, RoutedEventArgs e)  
{  
    media.Pause();