- 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
コンストラクタが気に入らないみたいだから、よりポインタに近くしたぞ
|