トップページ > プログラム > 2015年08月26日 > soKtzAZv

書き込み順位&時間帯一覧

2 位/150 ID中時間01234567891011121314151617181920212223Total
書き込み数06300011001000010000000013



使用した名前一覧書き込んだスレッド一覧
NAS6 ◆n3AmnVhjwc
mallocの後にfree不要と言うバカいるの?Part2

書き込みレス一覧

mallocの後にfree不要と言うバカいるの?Part2
638 :NAS6 ◆n3AmnVhjwc []:2015/08/26(水) 01:01:42.59 ID:soKtzAZv
#include <iostream>
using namespace std;
#define TEST

template<typename T>class A {
public:
 T* m_p;
 int m_size;
 A() {
  m_p = nullptr;
  m_size = 0;
#ifdef TEST
  cout << "コンストラクタ A"<<endl;
#endif
 }
 A(int n) :A() { m_p = new T[n]; m_size = n; }
 ~A() {
  if (m_p != nullptr) { delete[] m_p; m_p = nullptr; m_size = 0; }
#ifdef TEST
  cout << "デストラクタ A" << endl;
#endif
 }
};
mallocの後にfree不要と言うバカいるの?Part2
639 :NAS6 ◆n3AmnVhjwc []:2015/08/26(水) 01:02:10.89 ID:soKtzAZv
void dispAint(A<int> &a) {
 int i;
 for (i = 0; i < a.m_size; i++) cout << a.m_p[i] << endl;
}
void main() {
 int i;
 { A<int> a(10);
  for (i = 0; i < a.m_size; i++) a.m_p[i] = i + 10;
  dispAint(a); }
 i = 1;//ブレークポイント設定
 return;
}
delete使わないのがダメなだけだよ
スマートポインタを作りたいならこう書く
mallocの後にfree不要と言うバカいるの?Part2
640 :NAS6 ◆n3AmnVhjwc []:2015/08/26(水) 01:26:51.26 ID:soKtzAZv
void A::resize(int n) {
 int i;
 int m = (n < m_size ? n : m_size);
 T* tmp=new T[n];
 for (i = 0; i < m; i++) tmp[i] = m_p[i];
 delete[] m_p;
 m_p = tmp;
 m_size = n;
}
クラスAのリサイズをするんならこんな感じ
mallocの後にfree不要と言うバカいるの?Part2
642 :NAS6 ◆n3AmnVhjwc []:2015/08/26(水) 01:33:34.47 ID:soKtzAZv
ああ、こうだった
void A::resize(int n) {
 int i;
 int m = (n < m_size ? n : m_size);
 T* tmp=new T[n];
 if (m_p != nullptr) {
  for (i = 0; i < m; i++) tmp[i] = m_p[i];
  delete[] m_p;
 }
 m_p = tmp;
 m_size = n;
}
mallocの後にfree不要と言うバカいるの?Part2
643 :NAS6 ◆n3AmnVhjwc []:2015/08/26(水) 01:44:03.88 ID:soKtzAZv
>>641
どこが?って、そのまんまだよ

 { A<int> a(10);
  for (i = 0; i < a.m_size; i++) a.m_p[i] = i + 10;
  resize(5);
  dispAint(a); }

メモリの確保と破棄をこのスコープで自動的にやるよ
利用は参照渡しじゃないとデストラクタが複数回呼ばれちゃうけどな
mallocの後にfree不要と言うバカいるの?Part2
644 :NAS6 ◆n3AmnVhjwc []:2015/08/26(水) 01:45:51.99 ID:soKtzAZv
ミス
 { A<int> a(10);
  for (i = 0; i < a.m_size; i++) a.m_p[i] = i + 10;
  a.resize(5);
  dispAint(a); }
mallocの後にfree不要と言うバカいるの?Part2
646 :NAS6 ◆n3AmnVhjwc []:2015/08/26(水) 02:17:33.32 ID:soKtzAZv
所有権エラーが嫌ならthisポインタを保存すればいいだけのこと
ポインタとしての構文動作がしたいなら->()なり、*()なり
オペレータオーバーロードすりゃあいいだろ
#include <iostream>
using namespace std;
#define TEST

template<typename T>class A {
public:
 T* m_p;
 A* m_owner;
 int m_size;
 A() {
  m_owner = this;
  m_p = nullptr;
  m_size = 0;
#ifdef TEST
  cout << "コンストラクタ A"<<endl;
#endif
 }
 A(int n) :A() { m_p = new T[n]; m_size = n; }
 ~A() {
  if (m_owner == this && m_p != nullptr) {
   delete[] m_p; m_p = nullptr; m_size = 0;
#ifdef TEST
   cout << "デストラクタ A" << endl;
#endif
  }
 }
つづき
mallocの後にfree不要と言うバカいるの?Part2
647 :NAS6 ◆n3AmnVhjwc []:2015/08/26(水) 02:19:36.57 ID:soKtzAZv
つづき
 void resize(int n) {
  int i;
  int m = (n < m_size ? n : m_size);
  T* tmp=new T[n];
  if (m_owner == this && m_p != nullptr) {
   for (i = 0; i < m; i++) tmp[i] = m_p[i];
   delete[] m_p;
  }
  m_p = tmp;
  m_size = n;
 }
};

void dispAint(A<int> a) {
 int i;
 for (i = 0; i < a.m_size; i++) cout << a.m_p[i] << endl;
}

void main() {
 int i;
 {
  A<int> a(10);
  for (i = 0; i < a.m_size; i++) a.m_p[i] = i + 10;
  a.resize(5);
  dispAint(a);
 }
 i = 1;//ブレークポイント設定
 return;
}
mallocの後にfree不要と言うバカいるの?Part2
649 :NAS6 ◆n3AmnVhjwc []:2015/08/26(水) 02:29:19.01 ID:soKtzAZv
ポインタとしての構文動作がしたいなら->()なり、*()なり
オペレーターオーバーロードすりゃあいいだろ
mallocの後にfree不要と言うバカいるの?Part2
650 :NAS6 ◆n3AmnVhjwc []:2015/08/26(水) 06:56:12.48 ID:soKtzAZv
ttp://nas6.main.jp/sptr.cpp

スマートポインタで実装したい動作で↑で足りないものはないとおもう
mallocの後にfree不要と言うバカいるの?Part2
651 :NAS6 ◆n3AmnVhjwc []:2015/08/26(水) 07:00:39.49 ID:soKtzAZv
あとはoperator ->(???)の定義の仕方がよくわからん
mallocの後にfree不要と言うバカいるの?Part2
652 :NAS6 ◆n3AmnVhjwc []:2015/08/26(水) 10:50:48.63 ID:soKtzAZv
operator ->()もできた
mallocの後にfree不要と言うバカいるの?Part2
655 :NAS6 ◆n3AmnVhjwc []:2015/08/26(水) 15:07:52.81 ID:soKtzAZv
ttp://nas6.main.jp/sptr.cpp

コンストラクタが気に入らないみたいだから、よりポインタに近くしたぞ


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。