質問
私は最初の学習ベクトルのSTL、しばらくしてからもう一度、私を使いたいというベクトルのboolsのための私。見ても不思議な行動をとった研究では、こ ベクトルのboolsれていないベクトルのbools.
その他の共通した問題を避けるC++?
解決
ショートリストがす:
- を避けるメモリリークを通じて共通のものを使用へのポインタ管理メモリの割り当て清掃活動を実
- をご利用 資源獲得の初期化 (Rau-α()ムの管理資源の清掃活動の存在の例外
- 呼び出さないでください仮想関数のコンストラクタ
- 採用ミニマリスト符号化技術で、例えば変数を宣言する場合のみ、必要なスコープ変数初期のデザインが可能です。
- 真に理解する例外処理コード-の両方について例外を投げてもスローされる授業によって使用できる間接的には関係します。このことが重要であるとし、特に、存在のテンプレート。
Rau-α(共用ポケットのミニマリスト符号化はもちろん、そうではありません特有のC++、その問題を避けることになるだろうと頻繁に作物が展開されたものの翻訳であります。
優れた図書には:
- 有効なC++のコMeyers
- より効果的なC++-スコットMeyers
- C++符号化の標準サタ&Alexandrescu
- C++Faq-Cline
読これらの書籍は私もののような欠点をいう。
他のヒント
落とし穴がその重要性
まずはなるべくの賞を受賞 C++FAQ.多くの良い回答を落とし穴.ださい、 ##c++
月 irc.freenode.org
に IRC.また機会があればぜひおいできます。注以下のすべての落とし穴と書かれています。なんからコピーされたランダム源です。
delete[]
月new
,delete
月new[]
液:って上記の利回りに定義されていない動作:ものです。お客様のコードでは、常に delete[]
何 new[]
, は、 delete
何 new
, そうすることができない。
例外:
typedef T type[N]; T * pT = new type; delete[] pT;
必要なもの delete[]
ていても、 new
, おりますので新しい投稿内容の投稿者に対する配列の型になります。って作業する場合 typedef
, は、特別です。
呼び出する仮想関数が、コンストラクタまたはデストラクタ
液:呼び出する仮想関数がなにをオーバー機能に由来します。呼び出す 純粋な仮想関数 にコンストラクタまたはdesctructorは定義されていません。
呼び出し
delete
またはdelete[]
に削除してポインタ
液:割り当て0毎にポインタで削除します。呼び出し delete
または delete[]
にnullポインタは何も行いません。
のsizeofのポインタの場合、数要素の配列を計算します。
液:パスの要素の数をポインタが渡す必要がありま配列としてポインタへの機能です。使用機能の提案 こちらの まれに下記のようなsizeofの配列が、配列になります。
アレイを用いてこれまでのポインタです。このように、
T **
二次元配列になります。
液:見 こちらの それは異なる方法によって、処理するのかということ。
文書の文字列リテラル:
char * c = "hello"; *c = 'B';
液:配分の配列で初期化されたデータからの文字列リテラル、その書き込みを行うことができます:
char c[] = "hello"; *c = 'B';
文書の文字列リテラルは定義されていません。とにかく、上記の変換文字列リテラルを char *
で推奨されていません。でコンパイラにも警告を増やす場合警告レベル。
作成資源、そして忘れ無しにはいったい何がある投.
液:セーラームーンのポインタのように std::unique_ptr
または std::shared_ptr
指摘されているように、他の応答となります。
変更オブジェクトの倍のようにこの例:
i = ++i;
液:上記のように割り当てる i
の値 i+1
.しかしなが定義されていない。の代わりにincrementing i
状況に変わります i
右側です。変化するオブジェクトと配列をポイントは定義されていません。配列をポイントなど ||
, &&
, comma-operator
, semicolon
や entering a function
(体を網羅的にまことにありがとうございます。).変化のコードは以下で動作が正しく行: i = i + 1;
その他の課題
忘れるフラッシュの流れを呼び出す前に、ブロッキング機能など
sleep
.
液:ストリームをフラッシュによるストリーミングのいずれか std::endl
の代わりに \n
体験はお電話でも受け付け stream.flush();
.
宣言は、関数の代わりに変数となります。
液:の問題が生じた場合でコンパイラの解釈のための例
Type t(other_type(value));
機能として宣言の機能 t
帰国 Type
をパラメータの型 other_type
と呼ばれる value
.きの問題を解決しよう括弧内の最初の引数です。今す変数 t
タイプ Type
:
Type t((other_type(value)));
この関数を呼び出の無料のオブジェクトが宣言された現在の翻訳部
.cpp
ファイル).
液:の基準を定義していませんの創作の無料のオブジェクト(名前空間での範囲で指定された異なる翻訳です。呼び出す機能なオブジェクトな構は未定義です。を定義することができ、以下の機能のオブジェクトの翻訳単位ではなく、話するようになりますので、もっと
House & getTheHouse() { static House h; return h; }
このオブジェクトの需要にき続きご期待いただきたく、何卒完全なオブジェクトの構築時に呼び出す機能です。
定義テンプレート、
.cpp
ファイル中で使用され.cpp
ファイルです。
液:いまのようなエラー undefined reference to ...
.すべてのテンプレートの定義ヘッダにする場合には、このような、コンパイラを利用しているので、既にコード必要です。
static_cast<Derived*>(base);
場ベースのポインタを仮想基本クラスのDerived
.
液:仮想基本クラスがベースが一度だけであっても継承された異なる授業は間接的に継承す。のできるものではありませんで許可される。利用dynamic_castなっていることを確認してくださいごの基底クラスでは多型.
dynamic_cast<Derived*>(ptr_to_base);
の場合は非結晶
液:の標準的なaぼりのポインタ参照のオブジェクトに渡されない多型.かまたはその基底クラスでは、仮想機能です。
な機能受け入れ
T const **
液:ると思っている方がいるかもしれのより安全な使用 T **
, が、実際に影響を与えてしまうことにもなり頭痛の人がい T**
:標準のなすことはありません。でも例のなぜで許可:
int main() {
char const c = ’c’;
char* pc;
char const** pcc = &pc; //1: not allowed
*pcc = &c;
*pc = ’C’; //2: modifies a const object
}
常に受け入れ T const* const*;
です。
別の(閉)落とし穴のスレッドC++、人を探していますし、スタックオーバーフロー問題 C++落とし穴.
ブライアンはリスト:私の追加"を常にマークは単一引数のコンストラクタで明示的以外に希少ない自動鋳造)."
せんが特定の先端が、一般的なガイドライン:チェック。C++は言葉では大きく変わっています。ベ変化していますが、残念なことがまだまだ多くの古い情報があります。あの非常に良い図書の勧告にこちらできる第二の購入べてのスコットMeyers C++です。なブーストの符号化スタイル用ブーストに関わる人々にこのプロジェクトの最先端のC++のデザイン。
な管理ソリューションを提供いただけます。親のSTLの促進および、その施設できる限り転がります。特に、STL形式の文字列やコレクションを持っていない場合、非常に良い理由です。ウauto_ptrのブースへのポインター図書館、理解する状況を各種のスマートポインタが使用され、その後セーラームーンのポインタもあり、その使用原のポインタ.コード問い合わせ内容が確認でき効率的かつ多くが発生することが少なくなりメモリ解放されます。
利用static_cast,dynamic_cast,const_cast、reinterpret_castの代わりにC-スタイル鋳.とは異なりC-スタイル鋳もわかりやすく皆さんにお届けすればいいタイプの異なるキャストによると考えますか。もちviisually知のリーダーとキャストのために設立されました。
のウェブページ C++落とし穴 スコット輪カバーの主なC++の落とし穴.
二gotchasいしたことがなかったので知っているという:
(1)多くの出力などのprintf)バッファリングされるデフォルトです。だッチコードを使うバッファデバッグ諸表の最後に出力すが ない 本当に最後の印刷算出しています。このセクションのバッファをフラッシュ後にデバッグ印刷(またはoffのバッファリングした.
(2)ご注意くださいinitializations-(a)を避けるクラスのインスタンスとしてglobals/統計;(b)として初期化全てのメンバー変数も安全な値ctor場合でも、この些細な価値などにNULLポインタ.
推論:の順序のグローバルオブジェクトの初期化は保証されません(グローバル変数を含む静的変数を知る必要はありません。がコードするようなnondeterministicallyより異なりますのでオブジェクトXいて初期化される前のオブジェクトY.ない場合は明示的に初期化がプリミティブ型の変数など、会員またはbool enumクラスのょなど、いろいろな価値観を持った状況も、行動できるようで非常に非決定性.
しかし、私はでに数回、スコットMeyers図書 有効なC++ や 効果的なSTL カル重金援C++.
そういえば、スティ今日の画像の C++Gotchas も優れた"からの排水溝"資源です。彼の項目を転が独自の例外を除いるように構成されるべきであ援をしてもらいます。
C++のようなC.を作成およびリサイクルのコードです。
C++では、この例外の安全てのリリースが行われなくなります。C++を使用していま Rau-α( これを解決する問題です。
ソースはすべてのマニュアルの作成、リリースさに包まれたオブジェクトではこれらの活動を行い、コンストラクタ/デストラクタ.
// C Code
void myFunc()
{
Plop* plop = createMyPlopResource();
// Use the plop
releaseMyPlopResource(plop);
}
C++ではこのフィールに包まれたオブジェクト:
// C++
class PlopResource
{
public:
PlopResource()
{
mPlop=createMyPlopResource();
// handle exceptions and errors.
}
~PlopResource()
{
releaseMyPlopResource(mPlop);
}
private:
Plop* mPlop;
};
void myFunc()
{
PlopResource plop;
// Use the plop
// Exception safe release on exit.
}
書籍 C++Gotchas あると便利です。
ここにいくつかの例がありますの穴のあった不遇の下落です。これらすべての良い理由だけでは理解された後に噛まれる行動にはびっくりしました。
virtual
機能のコンストラクタ な.なに違反する ODR(一定義規則), えることが出来る匿名の名前空間(らい?
めの初期化員によって宣言しています。
class bar { vector<int> vec_; unsigned size_; // Note size_ declared *after* vec_ public: bar(unsigned size) : size_(size) , vec_(size_) // size_ is uninitialized {} };
デフォルト値
virtual
異なる意味論。class base { public: virtual foo(int i = 42) { cout << "base " << i; } }; class derived : public base { public: virtual foo(int i = 12) { cout << "derived "<< i; } }; derived d; base& b = d; b.foo(); // Outputs `derived 42`
最も重要な落とし穴初に開発者にとの間の混同を回避するためのCおよびC++.C++すべきではないとして扱われないCまたはCクラスでこのプルーン電力とすることができるよう、そしても危ない(特にメモリを利用してC)
チェック boost.org.で多くの追加機能、特にスマートポインタの実装方法です。
PRQAて 優れた無料のC++符号化の標準 に基づく書籍からスコットMeyers,Bjarne Stroustropやハーブサタ.ですべてのこれらの情報の集ます。
を使う場合は細心の注意が必要スマートポケットコンテナます。
回避 疑似クラスは、擬授業...Overdesignを基本とさせていただきます。
忘れを定義する基底クラスデストラクタです。この呼び出し delete
基*な破壊に由来する。
の名前空間を直進を含む構造体、クラス、名前空間を使用).これはまさに私にぴったりの状況に合った負荷が少ない不満の場合、プログラムだけでなコンパイル。
すべての空港を表示一部の空港を表を使用直ポインタ。代わりに使用しますrau-α(ほとんど何でも、もちろんご使用になることを右にスマートポインタ.書き込む場合は"削除"どこでも外ハンドルまたはポインタ型のクラスは、まる可能性は高いので間違っています。
Blizpasta.ことになる大きな一んですが...。
初期化されていない変数は大きな間違いが学生の鉱山です。多くのJavaあることを忘れてう"intカウンター"なセットカウンタを0になります。で定義する変数のhファイルと初期化のコンストラクタ/設定のオブジェクト)やすくなっています。
Off-by-oneエラー
for
ループ/配列アクセス。正しく洗浄コードオブジェクトが強いが始まります。
static_cast
ぼりチャットの基底クラス
ないそう---いつも私の勘違い:と思い A
以下のた仮想基本クラスに変わりはない;このよ10.3.1、 多様なクラス.を使用 static_cast
ここにいるようです。
struct B { virtual ~B() {} };
struct D : B { };
要約あり、これは危険な落とし穴.
常にチェックポインする前に逆参照です。C、通常、カウントにクラッシュ点の逆参照の悪いポインター;C++を作成することができ無効に参照するクラッシュでスポットから遠く離れの問題です。
class SomeClass
{
...
void DoSomething()
{
++counter; // crash here!
}
int counter;
};
void Foo(SomeClass & ref)
{
...
ref.DoSomething(); // if DoSomething is virtual, you might crash here
...
}
void Bar(SomeClass * ptr)
{
Foo(*ptr); // if ptr is NULL, you have created an invalid reference
// which probably WILL NOT crash here
}
忘れた &
とを創造することで、コピーの代わりに参照しています。
こう二度の異なる方法:
一インスタンスでは、引数リストが、大きなオブジェクトのスタックの結果のスタックオーバーフローおよびクラッシュの組み込みシステム。
を忘れてしまった
&
にインスタンス変数の効果のオブジェクトがコピーされます。登録後は、リスナーのコピーになぜかはないので、コールバックからのオブジェクトです。
の両方が見にくくなるのでスポットの差は小さくて見し、その物体および参照用の構文上を実装する予定です。
意図が (x == 10)
:
if (x = 10) {
//Do something
}
と思ったことは一切ございませんこと間違いないが、かかったのでした。
の論文/第 へのポインタを参考値 する上で、非常に有用である。う避けるのを避ける落とし穴とは良かったです。を閲覧することができ、サイト全体も含まれてプロのヒントを中心に、C++.
私は長年に亘り行うC++開発。書いた 次のプロジェクト の問題かったです。標準準拠のコンパイラは問題はないないその他の落とし穴についてはまだ有効になります。
#include <boost/shared_ptr.hpp>
class A {
public:
void nuke() {
boost::shared_ptr<A> (this);
}
};
int main(int argc, char** argv) {
A a;
a.nuke();
return(0);
}