Post

반응형

1. #include <crtdbg.h>를 한다.

2. 소스 코드 처음에 _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); 을 추가한다.

3. 만약 누수가 있다면


Detected memory leaks!
Dumping objects ->
{62} normal block at 0x00C34C50, 24 bytes long.
 Data: <                > 03 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 
Object dump complete.


이런식으로 나온다.


그리고 A부모 클래스가 있고 B자식 클래스가 있을 때

A* pB = new B()했을 경우

delete(pB)를 해도 메모리 누수가 되지 않는다.


반응형

Post

반응형

2. 내부 조인, 외부 조인 차이

   - 내부 조인은 조건에 맞는 정보만 보여준다.

     외부 조인은 왼쪽에 있는 테이블의 정보를 모두 보여준다.

     이 때 오른쪽 테이블의 데이터가 없다면 NULL이 된다.


3. 레퍼런스 포인터 차이

   포인터는 참조 대상을 아무때나 참조 가능하다.

   레퍼런스는 선언과 동시에 초기화를 해야만 한다.

   포인터는 주소값을 대입하고 레퍼런스는 실제값을 대입한다.

   그리고 포인터는 가르키는 대상을 바꿀 수 있지만

   레퍼런스는 바꿀 수 없다.


6. 프로시저 사용이유?

   - 테이블에 접근권한을 주지 않으면서 프로시저 실행권한만 주면 DB 데이터를 보호를 할 수 있다.

   - 캐싱될 롹률이 높다. 캐싱이 

   * 실행계획 프로시저 캐시란? SQL 서버가 컴파일된 쿼리 실행 계획을 저장하는 저장소.

     그냥 쿼리는 띄어쓰기가 하나 틀리다던가.. 그런이유로 저장이 안될 확률이 높다.

     쿼리는 사용빈도가 높으므로 저장확률이 더 높다.

     캐시에 저장되면 컴파일 다시 하지 않아도 되므로 성능상 이점이 있다.


7. 외래키란 무엇인가?

   - 다른테이블에 있는 내용을 참조하는 키.

     외래키가 존재하지않는다면 에러가 난다.



반응형

'etc' 카테고리의 다른 글

클립스튜디오 자기 브러쉬 등록하는 법  (0) 2024.05.06
VBA 오류들  (0) 2018.06.22
tortoisesvn Path  (0) 2018.05.30
No bootable medium found ( VirtualBox Window 10 설치 )  (0) 2018.05.09
[R데이터]네이버 뉴스 크롤링  (0) 2018.01.09
R 기초 - 프로그램 설치  (0) 2018.01.09

Post

반응형

MSSQL JOIN 정리


조인이란 두개 이상의 테이블을 조건에 맞게 합쳐서 새로운 테이블을 보여주는 것이다.

여러가지 join 방법이 있겠지만 INNER JOIN과 OUTER JOIN만 정리하였다.



사용법

SELECT A별칭.<행1>, B별칭.<행2>... FROM A A별칭 INNER JOIN B B별칭 ON 조건 



일단 테이블은 CharacterLv, CharacterItem 테이블이 있다.



     



INNER JOIN이란?

보여주겠다고 한 행과, 조건에 알맞은 데이터가 있을 시에 포함되는 것 만 보여주는 것이다.

예를 들어


1
2
3
4
5
6
7
8
USE ExEx
SELECT chLv.CharacterIndex,chLv.Lv,
 chItem.ItemIndex, chItem.ItemCount
FROM CharacterLv ChLv
    INNER JOIN
    CharacterItem ChItem
    ON ChLv.CharacterIndex = ChItem.CharacterIndex
 
cs


CharacterIndex, Lv, ItemIndex, ItemCount 행을 보여주면서 조건에 맞는 값만 보여줍니다.

마치 AND 같습니다.

(조건 값<CharacterIndex>이 맞다면 여러개 보여질 수 있습니다.)



<INNER JOIN 결과>


LEFT OUTER JOIN 이란?


LEFT OUTER JOIN 은 조건에 맞는 값만 보여주지만 조왼쪽에 있는 테이블은 전부 보여줍니다.

이 때 오른쪽 테이블에 해당하는 값이 없다면 null로 표기해줍니다.

그래서 어떤 테이블을 왼쪽에 놓는냐에 따라서 결과 값이 다릅니다.


<LEFT OUTER JOIN 결과>



위와 달리 CharacterItem 테이블을 왼쪽에 놓았을 경우.

CharacterItem 테이블 값이 전부 나옵니다.






반응형

'이전게시판 > MySQL MSSQL' 카테고리의 다른 글

MSSQL MYSQL 차이  (0) 2016.05.11
MSSQL 뷰, 인덱션, 트랜잭션, 저장 프로시저 정리  (0) 2016.05.11
MSSQL 기초 정리  (0) 2016.05.10

Post

반응형

옛날부터 다중상속을 하면 어떻게 되는지 헷갈렸다.

그래서 A, B를 동시에 상속받은 C가 Func를 호출하게 했다.

Func함수는 A, B 클래스에 동시에 있으므로

결론은 error C2385: 'Func' 액세스가 모호합니다.' 가 뜬다.

호출하려면 어떤 클래스인지 명확하게 지정해주고 사용한다.

그러므로 C클래스 안에서 Print 함수를 만들어서 부모를 지정해준 뒤 함수를 호출하면 된다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
#include <windows.h>
 
class A
{
public:
    int a;
    int b;
    A()
    {
        a = 100;
        b = 101;
    }
    
    void Func()
    {
        printf("A입니다 \n");
    }
};
 
class B
{
    
public:
    int a;
    int b;
    B()
    {
        a = 200;
        b = 201;
    }
    void Func()
    {
        printf("B입니다 \n");
    }
};
 
class C : public A, public B
{
public:
 
};
 
void main()
{
    C c;
    printf("%d %b \n", c.a(), c.b);
    getchar();
}
cs


반응형

Post

반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <stdio.h>
#include <windows.h>
#include <process.h>
 
#define NUM_THREAD 50
unsigned WINAPI threadInc(void* arg);
unsigned WINAPI threadDes(void* arg);
 
long long num = 0;
CRITICAL_SECTION cs;
 
int main(int argc, char* argv[])
{
    HANDLE tHandles[NUM_THREAD];
    int i = 0;
 
    InitializeCriticalSection(&cs);
    
    for(int j = 0; j < 2++j)
    {
        tHandles[i] = (HANDLE)_beginthreadex(NULL0, threadInc, NULL0NULL);
        ++i;
    }
    DWORD returnMessage = WaitForMultipleObjects(2, tHandles, TRUE, INFINITE);
    DeleteCriticalSection(&cs);
    printf("result:%d \n", num);
    return 0;
}
 
unsigned WINAPI threadInc(void* arg)
{
    int i;
    EnterCriticalSection(&cs);
    for(i = 0; i<1000++i)
    {
        num+=1;
        printf("num:%d i:%d \n", num, i); 
    }
    //LeaveCriticalSection(&cs);
    return 0;
}
 
unsigned WINAPI threadDes(void* arg)
{
    int i;
    EnterCriticalSection(&cs);
    for(i = 0; i<1000000++i)
        num-=1;
    //LeaveCriticalSection(&cs);
    return 0;
}
cs


윤성우의 TCP/IP책으로 공부를 하고 있다.

데드락에 대한 예제를 찾기가 어려웠다.

예전에는 데드락이 의도치 않게 잘 일어났었는데... 지금은 잘안됨 ㅋㅋ

일단 허접하게 LeaveCriticalSection을주석처리해서 다른 쓰레드가 접근하지 못하게 했다. 


내가 이해안가던게, 크리티컬 섹션에 접근을 못하는 건지, 해당 변수에 접근을 못해서

데드락이 걸리는건지 헷갈렸는데..

크리티컬 섹션을 꼼꼼히 안해주면 크리티컬 섹션 효과를 못보니까 크리티컬 섹션에 접근을 못해서 문제인 듯.



반응형

'이전게시판 > C, C++' 카테고리의 다른 글

C++ 11 람다식(Lamda)이란 - 1  (0) 2016.06.19
IOCP 소켓 종료 상황  (0) 2016.04.21
CRT 메모리 누수 체크  (0) 2016.04.15
C++ 다중상속 문제점?  (0) 2016.04.04
2의 보수 만드는 법  (0) 2016.04.01
구조체 패딩이란?  (0) 2016.03.31
C++ 스택(Stack) 예제  (0) 2016.03.20
C++ 간단한 원형 큐  (0) 2016.03.20

Post

반응형

2의 보수로 나타내는 법..

양수는 쉬운데 음수는 좀 어렵다.

4는 그대로 0000 0100 이다.

오른쪽부터 차례대로 1, 2, 4, 8, 16, 32..... 이렇게 나아간다.


만약 -4라면

1) 4 0000 0100 에서 반전 시킨다 -> 1111 1011

2) 1을 더해준다 -> 1111 1100

-4의 2의 보수(음수) 표현은 1111 1100 가 된다.



반응형

'이전게시판 > C, C++' 카테고리의 다른 글

IOCP 소켓 종료 상황  (0) 2016.04.21
CRT 메모리 누수 체크  (0) 2016.04.15
C++ 다중상속 문제점?  (0) 2016.04.04
C++ 데드락(DeadLock)  (0) 2016.04.04
구조체 패딩이란?  (0) 2016.03.31
C++ 스택(Stack) 예제  (0) 2016.03.20
C++ 간단한 원형 큐  (0) 2016.03.20
c++ 링크드리스트 만들기  (0) 2016.03.19

Post

반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
using namespace std;
 
struct Player
{
    char name;
    int level;
    short wClass;
};
 
#pragma pack(1)
struct Player2
{
    char name;
    int level;
    short wClass;
};
 
void main()
{
    Player player;
    Player2 player2;
 
    printf("name:%d level:%d class:%d AllSize:%d \n"sizeof(player.name),
        sizeof(player.level), sizeof(player.wClass), sizeof(player));
 
    printf("name:%d level:%d class:%d AllSize:%d \n"sizeof(player2.name),
        sizeof(player2.level), sizeof(player2.wClass), sizeof(player2));
 
    getchar();
}
cs

구조체 패딩은....
32비트 운영체제일 때는 4byte, 64비트 운영체제일 때는 8byte를 읽어온다.
그래서 빈공간이 있을 땐 딱 4byte, 8byte에 맞아 떨어지도록 구조체 패딩을한다.
그래서 Player의 사이즈는 7이 아니라 12이다. char도 4byte로 wClass도 4byte로 치환한다.
이것을 방지하기 위해선 pragma pack을 사용해 Player2 클래스처럼 만들어주면 된다.


반응형

'이전게시판 > C, C++' 카테고리의 다른 글

CRT 메모리 누수 체크  (0) 2016.04.15
C++ 다중상속 문제점?  (0) 2016.04.04
C++ 데드락(DeadLock)  (0) 2016.04.04
2의 보수 만드는 법  (0) 2016.04.01
C++ 스택(Stack) 예제  (0) 2016.03.20
C++ 간단한 원형 큐  (0) 2016.03.20
c++ 링크드리스트 만들기  (0) 2016.03.19
C++ 문자열 뒤집기, 한글 뒤집기  (0) 2016.03.18

Post

반응형

간단하게 C++ 스택 예제를 만들어보았습니다.

Stack은 먼저 들어온 애가 나중에 나가는 자료구조입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
using namespace std;
 
#define MAX_STACK_COUNT 5
 
class Stack
{
    int m_StackData[MAX_STACK_COUNT];
    int m_Top;
public:
    Stack()
    {
        memset(m_StackData, 0sizeof(m_StackData));
        m_Top = 0;
    }
    
    bool Push(int value)
    {
        if(isPull())
            return false;
 
        m_StackData[m_Top] = value;
        ++m_Top;
 
        return true;
    }
    
    bool Pop(int& value)
    {
        if(isEmpty())
            return false;
        
        value = m_StackData[m_Top];
        m_StackData[m_Top] = 0;
        --m_Top;
 
        return true;
    }
    
    bool isEmpty()
    {
        if(0 == m_Top)
            return true;
        
        return false;
    }
 
    bool isPull()
    {
        if(MAX_STACK_COUNT == m_Top)
            return true;
        
        return false;
    }
 
    void Print()
    {
        if(isEmpty())
            return;
 
        for(int i = m_Top - 1; i >= 0--i)
        {
            cout<< m_StackData[i] << endl;    
        } 
    }
};
 
void main()
{
    int data = 0;
    Stack stackData;
    stackData.Push(1);
    stackData.Push(2);    
    stackData.Push(3);
    stackData.Pop(data);    
    stackData.Push(4);
    stackData.Push(5);
    stackData.Print();
    stackData.Push(6);
    stackData.Push(7);
    stackData.Print();
    getchar();
}
cs


반응형

Post

반응형

간단한 원형 큐를 만들어보았습니다.

빨리 간단하게 만든거라서 틀리거나 버그가 있을 수 있습니다.

추후에 수정하겠습니다.

제가 이해한대로 만든 거라서..

아무튼 이렇게 강제 공부를 하고 있네요 ㅋㅋㅋ

나름 장점이라면 장점인가 ㅋㅋ?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <iostream>
using namespace std;
 
#define MAX_QUEUE_COUNT 5
 
class CicleQueue
{
    int m_Queue[MAX_QUEUE_COUNT];
    int m_front;
    int m_end;
    int m_Count;
public:
    CicleQueue()
    {
        memset(m_Queue, 0sizeof(m_Queue));
        m_front        = 0;
        m_end        = 0;
        m_Count        = 0;
    }
 
    bool Push(int value)
    {
        if(isPull())
            return false;
 
        m_Queue[m_end] = value;
        m_end = (m_end+1) % MAX_QUEUE_COUNT;
        ++m_Count;
 
        if(MAX_QUEUE_COUNT == m_end)
            m_end = 0;
 
        return true;
    }
 
    int Pop()
    {
        int temp = m_Queue[m_front];
        m_Queue[m_front] = 0;
        
        m_front = (m_front + 1) % MAX_QUEUE_COUNT;
        --m_Count;
        return temp;
    }
 
    bool isPull()
    {
        if(m_Count == MAX_QUEUE_COUNT)
            return true;
        
        return false;
    }
 
    void Print()
    {
        if(m_end <= m_front)
        {
            for(int i = m_front, j = 0; j < MAX_QUEUE_COUNT; ++i, ++j)
            {
                cout<<m_Queue[i%MAX_QUEUE_COUNT]<<" ";
            }
        }
        else
        {
            for(int i = 0; i < MAX_QUEUE_COUNT; ++i)
                cout<< m_Queue[i]<<" ";
        }
 
        cout<<endl;
    }
};
 
void main()
{
    CicleQueue cicleQueue;
    cicleQueue.Push(1);
    cicleQueue.Push(2);
    cicleQueue.Push(3);
    cicleQueue.Print();
    cicleQueue.Pop();
    cicleQueue.Push(4);
    cicleQueue.Push(5);
    cicleQueue.Pop();
    cicleQueue.Print();
    cicleQueue.Push(6);
    cicleQueue.Push(7);
    cicleQueue.Print();
    cicleQueue.Push(8);    
    cicleQueue.Print();
}
cs


반응형

Post

반응형
간단한 링크드 리스트를 만들어보았다.

서로 참조하는 링크드 리스트는 좀 어려운듯ㅠ_ㅠ

원형 큐도 공부해야 하고@_@ 공부할 것 많다 ㅋㅋ!

자료구조랑 DB랑 C, C++ 기초 확실하게 공부해야 한다.

혹시 오류 있으면 지적해주세요!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include <iostream>
using namespace std;
 
class Node
{
public:
    int nValue;
    Node* pNextNode;
};
 
class NodeList
{
    Node* m_pHead;
    
public:
    NodeList() : m_pHead(NULL)
    {
        
    }
    ~NodeList()
    {
        Node* pTemp = m_pHead;
        
        while(pTemp)
        {
            Node* pTempNode = pTemp;
            pTemp = pTemp->pNextNode;
        
            delete pTempNode;
            pTempNode = NULL;
        }
    }
 
    void Add(int Value)
    {
        if(NULL == m_pHead)
        {
            Node* pNewNode = new Node();
            pNewNode->nValue = Value;
            pNewNode->pNextNode = NULL;
            m_pHead = pNewNode;
        }
        else
        {
            Node* pTemp = m_pHead;
            
            while(true)
            {
                if(NULL == pTemp->pNextNode)
                    break;
                
                pTemp = pTemp->pNextNode;
            }
            
            Node* pNewNode = new Node();
            pNewNode->nValue = Value;
            pNewNode->pNextNode = NULL;
            pTemp->pNextNode = pNewNode;
        }
    }
 
    Node* Find(int Value)
    {
        Node* pTemp = m_pHead;
        
        while(pTemp)
        {
            if(pTemp->nValue == Value)
                return pTemp;
 
            pTemp = pTemp->pNextNode;
        }
 
        return NULL;
    }
 
    bool Delete(int Value)
    {
        Node* pTemp = m_pHead;
        Node* pTemp2 = NULL;
        bool bCheck = false;
 
        while(pTemp)
        {
            if(pTemp->nValue == Value)
            {
                bCheck = true;
                break;
            }
            pTemp2 = pTemp;
            pTemp = pTemp->pNextNode;
        }
 
        if(bCheck)
        {
            if(pTemp == m_pHead)
            {
                m_pHead = pTemp->pNextNode;
                delete pTemp;
                pTemp = NULL;    
            }
            else
            {
                pTemp2->pNextNode = pTemp->pNextNode;
                delete pTemp;
                pTemp = NULL;            
            }
        }
 
        return bCheck;
    }
 
    void Print()
    {
        Node* pTemp = m_pHead;
        
        while(NULL != pTemp)
        {
            printf("%d", pTemp->nValue);
            pTemp = pTemp->pNextNode;
        }
 
        printf("\n");
    }
};
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
class Node
{
public:
    int value;
    Node* m_pNextNode;
};
 
class LinkedList
{
    Node* m_pHead;
public:
    LinkedList()
    {
        m_pHead = NULL;
    }
 
    ~LinkedList()
    {
        Node* pNode = m_pHead;
        while(pNode)
        {
            Node* pTempNode = pNode->m_pNextNode;
            pNode = pNode->m_pNextNode;
            delete pTempNode;
            pTempNode = NULL;            
        }
    }
    
    void Add(int value)
    {
        Node* pNewNode = new Node();
        pNewNode->value = value;
        pNewNode->m_pNextNode = NULL;
            
        if(NULL == m_pHead)
        {
            m_pHead = pNewNode;
        }
        else
        {
            Node* pTemp = m_pHead;
            while(pTemp)
            {
                if(NULL == pTemp->m_pNextNode)
                {
                    pTemp->m_pNextNode = pNewNode;
                    break;
                }
                pTemp = pTemp->m_pNextNode;
            }
        }
    }
 
    Node* Find(int value)
    {
        Node* pNode = m_pHead;
        bool bResult = false;
        
        while(!pNode)
        {
            if(pNode->value == value)
                return pNode;
        }
        return NULL;
    }
 
    void Delete(int value)
    {
        Node* pTemp = m_pHead;
        Node* pTemp2 = NULL;
        bool bCheck = false;
 
        while(NULL != pTemp)
        {
            if(value == pTemp->value)
            {
                bCheck = true;
                break;
            }
 
            pTemp2 = pTemp;
            pTemp = pTemp->m_pNextNode;
        }
 
        if(bCheck)
        {
            if(m_pHead == pTemp)
            {
                m_pHead = pTemp->m_pNextNode;
                delete pTemp;
                pTemp = NULL;                
            }
            else
            {
                Node* pNode = pTemp->m_pNextNode;
                pTemp2->m_pNextNode = pNode;
                delete pTemp;
                pTemp = NULL;
            }
        }        
    }
 
    void Print()
    {
        Node* pNode = m_pHead;
 
        while(pNode)
        {
            cout<< pNode->value <<endl;
            pNode = pNode->m_pNextNode;
        }
        cout<<endl;
    }
};
 
void main()
{
    LinkedList linkedList;
    linkedList.Add(1);
    linkedList.Add(2);
    linkedList.Add(3);
    linkedList.Print();
    linkedList.Delete(1);
    linkedList.Delete(2);
    linkedList.Print();
    linkedList.Add(4);
    linkedList.Print();
    getchar();
}
cs


반응형
▲ top