質問編集履歴

5

CV++じゃない!

2018/01/18 08:06

投稿

notgoodpg
notgoodpg

スコア37

test CHANGED
File without changes
test CHANGED
@@ -136,4 +136,4 @@
136
136
 
137
137
  - VisualStudio2008
138
138
 
139
- - CV++
139
+ - VC++

4

コードを変更しました

2018/01/18 08:06

投稿

notgoodpg
notgoodpg

スコア37

test CHANGED
File without changes
test CHANGED
@@ -70,7 +70,9 @@
70
70
 
71
71
 
72
72
 
73
+ // memcpy(dst, m_src, sizeof(m_src)); ご指摘を受けて修正
74
+
73
- memcpy(dst, m_src, sizeof(m_src));
75
+ memcpy(dst, m_src, strLen);
74
76
 
75
77
 
76
78
 
@@ -98,9 +100,9 @@
98
100
 
99
101
 
100
102
 
101
- for (int i = 0; i < strLen; ++i) { // しかしmemcpyではsrcをdeleteしたことによって値が破壊され
103
+ for (int i = 0; i < strLen; ++i) { // 解決 // しかしmemcpyではsrcをdeleteしたことによって値が破壊され
102
104
 
103
- std::cout << str[i]; // 値の一部が変わってしまいました
105
+ std::cout << str[i]; // 解決 // 値の一部が変わってしまいました
104
106
 
105
107
  }
106
108
 

3

質問に不足があったため修正

2018/01/18 08:01

投稿

notgoodpg
notgoodpg

スコア37

test CHANGED
File without changes
test CHANGED
@@ -18,9 +18,15 @@
18
18
 
19
19
 
20
20
 
21
- 配列のポインタを指定したつもりのポインタが未定義のままになっており値を参照できない。
21
+ ~~配列のポインタを指定したつもりのポインタが未定義のままになっており値を参照できない。~~ // ご指摘により解決しました
22
22
 
23
+ memcpyによりdstに対してnewした領域にsrcの持っていた値がコピーされ、srcをdeleteしたところでdstにはすべての文字がコピーされ保持されると思っていました。
23
24
 
25
+ しかし、関数内でsrcをdeleteしたことによってdstから参照する文字の一部が破壊されてしまいます。
26
+
27
+ srcからコピーした文字をdstからすべて参照する方法は無いでしょうか?
28
+
29
+ (最初の質問で文章にし忘れていました。申し訳ございません)
24
30
 
25
31
  ###該当のソースコード
26
32
 
@@ -52,7 +58,9 @@
52
58
 
53
59
  // うまく動作しない関数
54
60
 
61
+ //int MemCpyTest(char* dst) ご指摘を受けて修正
62
+
55
- int MemCpyTest(char* dst)
63
+ int MemCpyTest(char*& dst)
56
64
 
57
65
  {
58
66
 
@@ -80,19 +88,19 @@
80
88
 
81
89
  {
82
90
 
83
- char *str = NULL; // ポインタはNULLで初期化するが
91
+ char *str = NULL; 
84
92
 
85
93
 
86
94
 
87
95
  IniSrc();
88
96
 
89
- int strLen = MemCpyTest(str); // ポインタ渡しして関数内でnewしてから値与えてあるから
97
+ int strLen = MemCpyTest(str); // newで確保た領域の先頭アドレスstrに渡す事に成功しました
90
98
 
91
99
 
92
100
 
93
- for (int i = 0; i < strLen; ++i) { // 参照できるっていたのです
101
+ for (int i = 0; i < strLen; ++i) { // しかしmemcpyではsrcdeleteしたこによって破壊され
94
102
 
95
- std::cout << str[i]; // ポインタ参照先が変わっていないようです
103
+ std::cout << str[i]; // 一部が変わってしまました
96
104
 
97
105
  }
98
106
 
@@ -118,6 +126,8 @@
118
126
 
119
127
 
120
128
 
129
+
130
+
121
131
  ###補足情報(言語/FW/ツール等のバージョンなど)
122
132
 
123
133
  - Windows7/64bit SP1

2

コード修正

2018/01/18 07:30

投稿

notgoodpg
notgoodpg

スコア37

test CHANGED
File without changes
test CHANGED
@@ -66,7 +66,7 @@
66
66
 
67
67
 
68
68
 
69
- delete[] m_src;
69
+ delete[] m_src; // いわゆる読み捨てのような事を行いたいのでここでm_srcをdeleteしてしまいたい
70
70
 
71
71
 
72
72
 
@@ -106,6 +106,10 @@
106
106
 
107
107
 
108
108
 
109
+ delete [] str; // ご指摘を受けて追加
110
+
111
+
112
+
109
113
  return 0;
110
114
 
111
115
  }

1

メッセージ変更

2018/01/18 07:17

投稿

notgoodpg
notgoodpg

スコア37

test CHANGED
File without changes
test CHANGED
@@ -86,13 +86,13 @@
86
86
 
87
87
  IniSrc();
88
88
 
89
- int strLen = MemCpyTest(str); // 関数内でnewしてから値を与えてあるから
89
+ int strLen = MemCpyTest(str); // ポインタ渡しして関数内でnewしてから値を与えてあるから
90
90
 
91
91
 
92
92
 
93
- for (int i = 0; i < strLen; ++i) { // 値を参照できると思ってい
93
+ for (int i = 0; i < strLen; ++i) { // 値を参照できると思っていたので
94
94
 
95
- std::cout << str[i];
95
+ std::cout << str[i]; // ポインタの参照先が変わっていないようです
96
96
 
97
97
  }
98
98