teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

5

CV++じゃない!

2018/01/18 08:06

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -67,4 +67,4 @@
67
67
  ###補足情報(言語/FW/ツール等のバージョンなど)
68
68
  - Windows7/64bit SP1
69
69
  - VisualStudio2008
70
- - CV++
70
+ - VC++

4

コードを変更しました

2018/01/18 08:06

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -34,7 +34,8 @@
34
34
  const int strLen = 16;
35
35
  dst = new char[16];
36
36
 
37
+ // memcpy(dst, m_src, sizeof(m_src)); ご指摘を受けて修正
37
- memcpy(dst, m_src, sizeof(m_src));
38
+ memcpy(dst, m_src, strLen);
38
39
 
39
40
  delete[] m_src; // いわゆる読み捨てのような事を行いたいのでここでm_srcをdeleteしてしまいたい
40
41
 
@@ -48,8 +49,8 @@
48
49
  IniSrc();
49
50
  int strLen = MemCpyTest(str); // newで確保した領域の先頭アドレスをstrに渡す事に成功しました
50
51
 
51
- for (int i = 0; i < strLen; ++i) { // しかしmemcpyではsrcをdeleteしたことによって値が破壊され
52
+ for (int i = 0; i < strLen; ++i) { // 解決 // しかしmemcpyではsrcをdeleteしたことによって値が破壊され
52
- std::cout << str[i]; // 値の一部が変わってしまいました
53
+ std::cout << str[i]; // 解決 // 値の一部が変わってしまいました
53
54
  }
54
55
 
55
56
  std::cout << std::endl;

3

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

2018/01/18 08:01

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -8,8 +8,11 @@
8
8
  よろしくお願いいたします。
9
9
  ###発生している問題・エラーメッセージ
10
10
 
11
- 配列のポインタを指定したつもりのポインタが未定義のままになっており値を参照できない。
11
+ ~~配列のポインタを指定したつもりのポインタが未定義のままになっており値を参照できない。~~ // ご指摘により解決しました
12
-
12
+ memcpyによりdstに対してnewした領域にsrcの持っていた値がコピーされ、srcをdeleteしたところでdstにはすべての文字がコピーされ保持されると思っていました。
13
+ しかし、関数内でsrcをdeleteしたことによってdstから参照する文字の一部が破壊されてしまいます。
14
+ srcからコピーした文字をdstからすべて参照する方法は無いでしょうか?
15
+ (最初の質問で文章にし忘れていました。申し訳ございません)
13
16
  ###該当のソースコード
14
17
  ```c++
15
18
  #include <iostream>
@@ -25,7 +28,8 @@
25
28
  memcpy( m_src, temp, sizeof(temp));
26
29
  }
27
30
  // うまく動作しない関数
31
+ //int MemCpyTest(char* dst) ご指摘を受けて修正
28
- int MemCpyTest(char* dst)
32
+ int MemCpyTest(char*& dst)
29
33
  {
30
34
  const int strLen = 16;
31
35
  dst = new char[16];
@@ -39,13 +43,13 @@
39
43
 
40
44
  int main()
41
45
  {
42
- char *str = NULL; // ポインタはNULLで初期化するが
46
+ char *str = NULL; 
43
47
 
44
48
  IniSrc();
45
- int strLen = MemCpyTest(str); // ポインタ渡しして関数内でnewしてから値与えてあるから
49
+ int strLen = MemCpyTest(str); // newで確保た領域の先頭アドレスstrに渡す事に成功しました
46
50
 
47
- for (int i = 0; i < strLen; ++i) { // 値を参照きるっていたのです
51
+ for (int i = 0; i < strLen; ++i) { // しかしmemcpyはsrcをdeleteしたこによって破壊され
48
- std::cout << str[i]; // ポインタ参照先が変わっていないようです
52
+ std::cout << str[i]; // 一部が変わってしまました
49
53
  }
50
54
 
51
55
  std::cout << std::endl;
@@ -58,6 +62,7 @@
58
62
  }
59
63
  ```
60
64
 
65
+
61
66
  ###補足情報(言語/FW/ツール等のバージョンなど)
62
67
  - Windows7/64bit SP1
63
68
  - VisualStudio2008

2

コード修正

2018/01/18 07:30

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
  memcpy(dst, m_src, sizeof(m_src));
34
34
 
35
- delete[] m_src;
35
+ delete[] m_src; // いわゆる読み捨てのような事を行いたいのでここでm_srcをdeleteしてしまいたい
36
36
 
37
37
  return strLen;
38
38
  }
@@ -52,6 +52,8 @@
52
52
 
53
53
  std::cin;
54
54
 
55
+ delete [] str; // ご指摘を受けて追加
56
+
55
57
  return 0;
56
58
  }
57
59
  ```

1

メッセージ変更

2018/01/18 07:17

投稿

notgoodpg
notgoodpg

スコア37

title CHANGED
File without changes
body CHANGED
@@ -42,10 +42,10 @@
42
42
  char *str = NULL; // ポインタはNULLで初期化するが
43
43
 
44
44
  IniSrc();
45
- int strLen = MemCpyTest(str); // 関数内でnewしてから値を与えてあるから
45
+ int strLen = MemCpyTest(str); // ポインタ渡しして関数内でnewしてから値を与えてあるから
46
46
 
47
- for (int i = 0; i < strLen; ++i) { // 値を参照できると思ってい
47
+ for (int i = 0; i < strLen; ++i) { // 値を参照できると思っていたので
48
- std::cout << str[i];
48
+ std::cout << str[i]; // ポインタの参照先が変わっていないようです
49
49
  }
50
50
 
51
51
  std::cout << std::endl;