スマートポインタとは何ですか?いつ使用する必要がありますか?

1885
Alex Reynolds 2008-09-20 14:09.

スマートポインタとは何ですか?いつ使用する必要がありますか?

14 answers

1930
Lloyd 2008-09-20 14:48.

更新

この答えはかなり古いので、Boostライブラリによって提供されたスマートポインタであった当時の「良い」ものを説明しています。C ++ 11ので、標準ライブラリには、十分なスマートポインタの種類を提供している、とあなたはの使用を支持すべきであるstd::unique_ptrstd::shared_ptrstd::weak_ptr

もありましたstd::auto_ptr。スコープ付きポインタと非常によく似ていましたが、コピーされる「特別な」危険な機能もあり、予期せず所有権が譲渡されていました。
C ++ 11で非推奨になり、C ++ 17削除されたため、使用しないでください。

std::auto_ptr<MyObject> p1 (new MyObject());
std::auto_ptr<MyObject> p2 = p1; // Copy and transfer ownership. 
                                 // p1 gets set to empty!
p2->DoSomething(); // Works.
p1->DoSomething(); // Oh oh. Hopefully raises some NULL pointer exception.

古い答え

スマートポインタは、ポイントされているオブジェクトの存続期間を管理するために、「生」(または「ベア」)C ++ポインタをラップするクラスです。単一のスマートポインタ型はありませんが、それらはすべて、実用的な方法で生のポインタを抽象化しようとします。

スマートポインタは、生のポインタよりも優先されるべきです。ポインタを使用する必要があると感じた場合(実際に使用するかどうかを最初に検討してください)、通常はスマートポインタを使用することをお勧めします。これにより、主にオブジェクトの削除を忘れたり、メモリリークが発生したりするなど、生のポインタに関する多くの問題を軽減できます。

生のポインターを使用すると、プログラマーは、オブジェクトが役に立たなくなったときに、オブジェクトを明示的に破棄する必要があります。

// Need to create the object to achieve some goal
MyObject* ptr = new MyObject(); 
ptr->DoSomething(); // Use the object in some way
delete ptr; // Destroy the object. Done with it.
// Wait, what if DoSomething() raises an exception...?

比較すると、スマートポインターは、オブジェクトがいつ破棄されるかに関するポリシーを定義します。それでもオブジェクトを作成する必要がありますが、オブジェクトを破棄することを心配する必要はありません。

SomeSmartPtr<MyObject> ptr(new MyObject());
ptr->DoSomething(); // Use the object in some way.

// Destruction of the object happens, depending 
// on the policy the smart pointer class uses.

// Destruction would happen even if DoSomething() 
// raises an exception

使用されている最も単純なポリシーには、boost::scoped_ptrまたはによって実装されるなど、スマートポインターラッパーオブジェクトのスコープが含まれますstd::unique_ptr

void f()
{
    {
       std::unique_ptr<MyObject> ptr(new MyObject());
       ptr->DoSomethingUseful();
    } // ptr goes out of scope -- 
      // the MyObject is automatically destroyed.

    // ptr->Oops(); // Compile error: "ptr" not defined
                    // since it is no longer in scope.
}

std::unique_ptrインスタンスはコピーできないことに注意してください。これにより、ポインタが複数回(誤って)削除されるのを防ぎます。ただし、それへの参照を、呼び出す他の関数に渡すことはできます。

std::unique_ptr■オブジェクトの存続期間を特定のコードブロックに関連付けたい場合、またはオブジェクトを別のオブジェクト内にメンバーデータとして埋め込んだ場合は、その別のオブジェクトの存続期間が役立ちます。オブジェクトは、含まれているコードブロックが終了するまで、または含まれているオブジェクト自体が破棄されるまで存在します。

より複雑なスマートポインターポリシーには、ポインターをカウントする参照が含まれます。これにより、ポインタをコピーできます。オブジェクトへの最後の「参照」が破棄されると、オブジェクトは削除されます。このポリシーはによって実装されるboost::shared_ptrstd::shared_ptr

void f()
{
    typedef std::shared_ptr<MyObject> MyObjectPtr; // nice short alias
    MyObjectPtr p1; // Empty

    {
        MyObjectPtr p2(new MyObject());
        // There is now one "reference" to the created object
        p1 = p2; // Copy the pointer.
        // There are now two references to the object.
    } // p2 is destroyed, leaving one reference to the object.
} // p1 is destroyed, leaving a reference count of zero. 
  // The object is deleted.

参照カウントポインタは、オブジェクトの存続期間がはるかに複雑で、コードの特定のセクションや別のオブジェクトに直接関連付けられていない場合に非常に役立ちます。

カウントされたポインタを参照することには1つの欠点があります。それは、ぶら下がっている参照を作成する可能性です。

// Create the smart pointer on the heap
MyObjectPtr* pp = new MyObjectPtr(new MyObject())
// Hmm, we forgot to destroy the smart pointer,
// because of that, the object is never destroyed!

もう1つの可能性は、循環参照を作成することです。

struct Owner {
   std::shared_ptr<Owner> other;
};

std::shared_ptr<Owner> p1 (new Owner());
std::shared_ptr<Owner> p2 (new Owner());
p1->other = p2; // p1 references p2
p2->other = p1; // p2 references p1

// Oops, the reference count of of p1 and p2 never goes to zero!
// The objects are never destroyed!

この問題を回避するために、BoostとC ++ 11の両方で、weak_ptrへの弱い(カウントされない)参照を定義するaが定義されていますshared_ptr

327
einpoklum 2015-05-10 09:06.

最近のC ++(C ++ 11以降)の簡単な答えは次のとおりです。

  • 「スマートポインタとは何ですか?」
    これは、値をポインターのように使用できるタイプですが、自動メモリ管理の追加機能を提供します。スマートポインターが使用されなくなると、それが指すメモリの割り当てが解除されます(Wikipediaの詳細な定義も参照してください)。
  • 「いつ使うべき?」
    メモリの所有権の追跡、割り当てまたは割り当て解除を含むコード。スマートポインタを使用すると、これらのことを明示的に行う必要がなくなることがよくあります。
  • 「しかし、これらの場合、どのスマートポインタを使用する必要がありますか?」
    • std::unique_ptrオブジェクトへの単一の所有参照が存続する限り、オブジェクトを存続させたい場合に使用します。たとえば、あるスコープに入ると割り当てられ、スコープを出ると割り当てが解除されるメモリへのポインタに使用します。
    • std::shared_ptr複数の場所からオブジェクトを参照したい場合に使用します。これらの参照がすべてなくなるまで、オブジェクトの割り当てを解除したくない場合に使用します。
    • std::weak_ptr複数の場所からオブジェクトを参照する場合に使用します-無視して割り当てを解除しても問題ない参照の場合(逆参照しようとするとオブジェクトがなくなったことに注意するだけです)。
    • boost::スマートポインタを使用しないでください。またはstd::auto_ptr、必要に応じて読み上げることができる特別な場合を除きます。
  • 「ねえ、どれを使うか聞いてなかった!」
    ああ、でもあなたは本当に望んでいた、それを認めなさい。
  • 「では、いつ通常のポインタを使用する必要がありますか?」
    主に、メモリの所有権を知らないコードで。これは通常、他の場所からポインターを取得し、割り当ても割り当て解除もせず、実行よりも長持ちするポインターのコピーを格納しない関数にあります。
114
sergtk 2008-09-20 14:32.

スマートポインタはポインタのようなタイプのいくつかの追加機能、例えば自動メモリ解放、参照カウントなどであります

Smart Pointers-What、Why、Which?のページで簡単な紹介があります。。

単純なスマートポインタタイプの1つはstd::auto_ptr(C ++標準の20.4.5章)です。これにより、スコープ外のメモリの割り当てを自動的に解除でき、柔軟性は劣りますが、例外がスローされた場合の単純なポインタの使用よりも堅牢です。

もう1つの便利なタイプはboost::shared_ptr、参照カウントを実装し、オブジェクトへの参照が残っていない場合にメモリの割り当てを自動的に解除するタイプです。これにより、メモリリークを回避でき、RAIIの実装に簡単に使用できます。

この主題は、David Vandevoorde著の本「C ++ Templates:The Complete Guide」、Nicolai M. Josuttis、第20章の章で詳細に説明されています。スマートポインタ。カバーされるいくつかのトピック:

  • 例外からの保護
  • ホルダー、(注、std :: auto_ptrはそのようなタイプのスマートポインターの実装です)
  • リソース取得は初期化です(これは、C ++での例外安全なリソース管理に頻繁に使用されます)
  • ホルダーの制限
  • 参照カウント
  • 同時カウンターアクセス
  • 破壊と割り当て解除
44
Sridhar Iyer 2008-09-20 15:53.

Chris、Sergdev、Llyodによって提供された定義は正しいです。ただし、人生をシンプルにするために、より単純な定義を好みます。スマートポインターは、->and*演算子をオーバーロードするクラスです。あなたのオブジェクトは、意味的にポインタのように見えますが、あなたはそれが参照カウント、自動破壊等を含む方法クーラーの事を、間に合わせることができ、どの手段shared_ptrauto_ptr、ほとんどの場合で十分ですが、小さな特異性の独自のセットと一緒に来ます。

32
markets 2008-09-20 14:13.

スマートポインタは、「char *」のような通常の(型指定された)ポインタに似ていますが、ポインタ自体がスコープ外になると、それが指すものも削除される点が異なります。「->」を使用すると、通常のポインタと同じように使用できますが、データへの実際のポインタが必要な場合は使用できません。そのためには、「&* ptr」を使用できます。

これは次の場合に役立ちます。

  • newで割り当てる必要があるが、そのスタック上のものと同じ存続期間を持たせたいオブジェクト。オブジェクトがスマートポインタに割り当てられている場合、プログラムがその関数/ブロックを終了すると、オブジェクトは削除されます。

  • クラスのデータメンバー。オブジェクトが削除されると、所有されているすべてのデータも削除されます。デストラクタに特別なコードはありません(デストラクタが仮想であることを確認する必要があります。これは、ほとんどの場合、適切な方法です)。 。

次の場合、スマートポインタを使用したくない場合があります。

  • ...ポインタは実際にはデータを所有するべきではありません...つまり、データを使用しているだけで、参照している関数を存続させたい場合です。
  • ...スマートポインタ自体がいつか破壊されることはありません。(動的に割り当てられているが明示的に削除されないオブジェクトなど)、決して破壊されないメモリ内に配置することは望ましくありません。
  • ... 2つのスマートポインタが同じデータを指している可能性があります。(ただし、それを処理するさらにスマートなポインターがあります...これは参照カウントと呼ばれます。)

参照:

  • ガベージコレクション。
  • データの所有権に関するこのスタックオーバーフローの質問
19
Chris Jester-Young 2008-09-20 14:14.

ほとんどの種類のスマートポインタは、ポインタ先オブジェクトの破棄を処理します。オブジェクトを手動で破棄することを考える必要がなくなるため、非常に便利です。

最も一般的に使用されるスマートポインタはstd::tr1::shared_ptr(またはboost::shared_ptr)であり、あまり一般的ではありませんがstd::auto_ptr。の定期的な使用をお勧めしますshared_ptr

shared_ptrは非常に用途が広く、オブジェクトを「DLLの境界を越えて渡す」必要がある場合(libcコードとDLL間で異なるが使用される場合の一般的な悪夢の場合)など、さまざまな廃棄シナリオを処理します。

19
Saqlain 2013-03-12 23:51.

スマートポインターは、ポインターのように機能するオブジェクトですが、さらに、構築、破棄、コピー、移動、および逆参照の制御を提供します。

独自のスマートポインタを実装することもできますが、多くのライブラリには、それぞれ異なる長所と短所を持つスマートポインタの実装も用意されています。

たとえば、Boostは次のスマートポインタ実装を提供します。

  • shared_ptr<T>は、T参照カウントを使用して、オブジェクトが不要になった時期を判断するためのポインタです。
  • scoped_ptr<T>スコープ外になると自動的に削除されるポインタです。割り当てはできません。
  • intrusive_ptr<T>別の参照カウントポインタです。よりも優れたパフォーマンスを提供しますshared_ptrが、タイプTには独自の参照カウントメカニズムを提供する必要があります。
  • weak_ptr<T>は弱ポインタ​​であり、shared_ptr循環参照を回避するために連携して機能します。
  • shared_array<T>に似てshared_ptrいますが、の配列用ですT
  • scoped_array<T>に似てscoped_ptrいますが、の配列用ですT

これらはそれぞれの1つの線形記述であり、必要に応じて使用できます。詳細と例については、Boostのドキュメントを参照してください。

さらに、C ++標準ライブラリは3つのスマートポインタを提供します。std::unique_ptr一意の所有権、std::shared_ptr共有の所有権、およびstd::weak_ptrstd::auto_ptrC ++ 03に存在していましたが、現在は非推奨です。

12
Santosh 2014-03-07 23:03.

同様の回答へのリンクは次のとおりです。 http://sickprogrammersarea.blogspot.in/2014/03/technical-interview-questions-on-c_6.html

スマートポインタは、通常のポインタのように動作、外観、および感触がありますが、より多くの機能を提供するオブジェクトです。C ++では、スマートポインターは、ポインターをカプセル化し、標準のポインター演算子をオーバーライドするテンプレートクラスとして実装されます。これらには、通常のポインターに比べて多くの利点があります。これらは、nullポインタまたはヒープオブジェクトへのポインタとして初期化されることが保証されています。nullポインタを介した間接参照がチェックされます。削除する必要はありません。オブジェクトへの最後のポインタがなくなると、オブジェクトは自動的に解放されます。これらのスマートポインタの重要な問題の1つは、通常のポインタとは異なり、継承を尊重しないことです。スマートポインタは、ポリモーフィックコードにとって魅力的ではありません。以下に示すのは、スマートポインターの実装の例です。

例:

template <class X>
class smart_pointer
{
          public:
               smart_pointer();                          // makes a null pointer
               smart_pointer(const X& x)            // makes pointer to copy of x

               X& operator *( );
               const X& operator*( ) const;
               X* operator->() const;

               smart_pointer(const smart_pointer <X> &);
               const smart_pointer <X> & operator =(const smart_pointer<X>&);
               ~smart_pointer();
          private:
               //...
};

このクラスは、タイプXのオブジェクトへのスマートポインターを実装します。オブジェクト自体はヒープ上にあります。使用方法は次のとおりです。

smart_pointer <employee> p= employee("Harris",1333);

他のオーバーロードされた演算子と同様に、pは通常のポインタのように動作します。

cout<<*p;
p->raise_salary(0.5);
10
Jorge Ferreira 2008-09-20 14:12.

http://en.wikipedia.org/wiki/Smart_pointer

コンピュータサイエンスでは、スマートポインタは、自動ガベージコレクションや境界チェックなどの追加機能を提供しながら、ポインタをシミュレートする抽象データ型です。これらの追加機能は、効率を維持しながら、ポインターの誤用によって引き起こされるバグを減らすことを目的としています。スマートポインタは通常、メモリ管理の目的で、それらを指すオブジェクトを追跡します。ポインタの誤用はバグの主な原因です。ポインタを使用して記述されたプログラムによって実行されなければならない一定の割り当て、割り当て解除、および参照により、メモリリークが発生する可能性が非常に高くなります。スマートポインタは、リソースの割り当て解除を自動化することでメモリリークを防止しようとします。オブジェクトへのポインタ(または一連のポインタの最後)が破棄されると、たとえばスコープ外になると、ポイントされたオブジェクトも破棄されます。

7
nnrales 2016-03-03 14:58.

このチュートリアルではTをクラスとします。C++のポインタは3つのタイプに分けることができます。

1)生のポインタ

T a;  
T * _ptr = &a; 

それらは、メモリ内の場所へのメモリアドレスを保持します。プログラムが複雑になり、追跡が困難になるため、注意して使用してください。

constデータまたはアドレスを持つポインター{逆方向に読み取る}

T a ; 
const T * ptr1 = &a ; 
T const * ptr1 = &a ;

constであるデータ型Tへのポインター。つまり、ポインタを使用してデータ型を変更することはできません。すなわち*ptr1 = 19; 動作しないでしょう。ただし、ポインタを移動することはできます。すなわちptr1++ , ptr1--; などが動作します。逆方向に読む:constであるT型へのポインタ

  T * const ptr2 ;

データ型Tへのconstポインタ。つまり、ポインタを移動することはできませんが、ポインタが指す値を変更することはできます。つまり、*ptr2 = 19機能しますが、ptr2++ ; ptr2--etcは機能しません。逆方向に読み取る:タイプTへのconstポインター

const T * const ptr3 ; 

constデータ型Tへのconstポインタ。つまり、ポインタを移動したり、データ型ポインタをポインタに変更したりすることはできません。すなわち。ptr3-- ; ptr3++ ; *ptr3 = 19;動作しないでしょう

3)スマートポインタ:{ #include <memory>}

共有ポインタ

  T a ; 
     //shared_ptr<T> shptr(new T) ; not recommended but works 
     shared_ptr<T> shptr = make_shared<T>(); // faster + exception safe

     std::cout << shptr.use_count() ; // 1 //  gives the number of " 
things " pointing to it. 
     T * temp = shptr.get(); // gives a pointer to object

     // shared_pointer used like a regular pointer to call member functions
      shptr->memFn();
     (*shptr).memFn(); 

    //
     shptr.reset() ; // frees the object pointed to be the ptr 
     shptr = nullptr ; // frees the object 
     shptr = make_shared<T>() ; // frees the original object and points to new object

参照カウントを使用して実装され、ポインターが指すオブジェクトを指す「もの」の数を追跡します。このカウントが0になると、オブジェクトは自動的に削除されます。つまり、オブジェクトを指すすべてのshare_ptrがスコープ外になると、オブジェクトは削除されます。これにより、newを使用して割り当てたオブジェクトを削除しなければならないという頭痛の種がなくなります。

弱いポインター:共有ポインターを使用するときに発生する循環参照の処理に役立ちます2つの共有ポインターが指す2つのオブジェクトがあり、相互に共有ポインターを指す内部共有ポインターがある場合、循環参照があり、オブジェクトはありません共有ポインタがスコープ外になると削除されます。これを解決するには、内部メンバーをshared_ptrからweak_ptrに変更します。注:弱いポインターが指す要素にアクセスするには、lock()を使用します。これにより、weak_ptrが返されます。

T a ; 
shared_ptr<T> shr = make_shared<T>() ; 
weak_ptr<T> wk = shr ; // initialize a weak_ptr from a shared_ptr 
wk.lock()->memFn() ; // use lock to get a shared_ptr 
//   ^^^ Can lead to exception if the shared ptr has gone out of scope
if(!wk.expired()) wk.lock()->memFn() ;
// Check if shared ptr has gone out of scope before access

参照:std :: weak_ptrはいつ役に立ちますか?

ユニークポインター:独占所有権を持つ軽量スマートポインター。ポインタ間でオブジェクトを共有せずに、ポインタが一意のオブジェクトを指す場合に使用します。

unique_ptr<T> uptr(new T);
uptr->memFn(); 

//T * ptr = uptr.release(); // uptr becomes null and object is pointed to by ptr
uptr.reset() ; // deletes the object pointed to by uptr 

一意のptrが指すオブジェクトを変更するには、移動セマンティクスを使用します

unique_ptr<T> uptr1(new T);
unique_ptr<T> uptr2(new T);
uptr2 = std::move(uptr1); 
// object pointed by uptr2 is deleted and 
// object pointed by uptr1 is pointed to by uptr2
// uptr1 becomes null 

参照:これらは基本的にconstポインター、つまりconstであり、より適切な構文で移動できないポインターと見なすことができます。

参照:C ++のポインター変数と参照変数の違いは何ですか?

r-value reference : reference to a temporary object   
l-value reference : reference to an object whose address can be obtained
const reference : reference to a data type which is const and cannot be modified 

参照 : https://www.youtube.com/channel/UCEOGtxYTB6vo6MQ-WQ9W_nQ この質問を指摘してくれたAndreに感謝します。

4
Trombe 2017-06-13 13:23.

スマートポインタはクラスであり、通常のポインタのラッパーです。通常のポインターとは異なり、スマートポイントのライフサークルは、参照カウント(スマートポインターオブジェクトが割り当てられた回数)に基づいています。したがって、スマートポインターが別のポインターに割り当てられると、内部参照カウントにプラスプラスが加算されます。また、オブジェクトがスコープ外になると、参照カウントからマイナスが差し引かれます。

自動ポインタは見た目は似ていますが、スマートポインタとはまったく異なります。これは、自動ポインタオブジェクトが変数スコープから外れるたびにリソースの割り当てを解除する便利なクラスです。ある程度、(動的に割り当てられたメモリへの)ポインタを(コンパイル時に静的に割り当てられた)スタック変数と同様に機能させます。

2
Daksh 2016-11-07 18:07.

スマートポインタは、メモリの割り当て解除、リソースの共有、および転送について心配する必要がないものです。

これらのポインタは、Javaで割り当てが機能するのと同じように非常にうまく使用できます。Javaではガベージコレクターがトリックを実行しますが、スマートポインターでは、トリックはデストラクタによって実行されます。

2
da77a 2018-01-26 17:10.

既存の答えは良いですが、スマートポインターが解決しようとしている問題に対する(完全な)答えではない場合の対処方法については説明していません。

とりわけ(他の回答でよく説明されている)スマートポインターを使用することは、関数の戻り値の型として抽象クラスをどのように使用するかに対する可能な解決策です。これは、この質問の複製としてマークされています。ただし、C ++の戻り値の型として抽象(または実際には任意の)基本クラスを指定したいかどうかを尋ねる最初の質問は、「本当にどういう意味ですか?」です。ブーストポインタコンテナライブラリのドキュメントには、C ++での慣用的なオブジェクト指向プログラミング(およびこれが他の言語とどのように異なるか)についての良い議論があります(詳細は参照してください)。要約すると、C ++では、所有権について考える必要があります。どのスマートポインターが役立ちますが、唯一の解決策ではなく、常に完全な解決策であり(多形コピーを提供しません)、インターフェイスで公開したい解決策であるとは限りません(関数の戻りはひどい音に聞こえます)インターフェイスのようなものです)。たとえば、参照を返すだけで十分な場合があります。しかし、これらすべての場合(スマートポインター、ポインターコンテナー、または単に参照を返す)では、戻りから何らかの形式の参照に変更しました。本当にコピーが必要な場合は、定型的な「イディオム」を追加するか、Adobe PolyやBoost.TypeErasureなどのライブラリを使用して、C ++の慣用的な(またはその他の)OOPを超えてより一般的なポリモーフィズムに移行する必要があります。

1
lbsweek 2020-08-10 00:04.

スマートポインタとは何ですか。

ロングバージョン、原則として:

https://web.stanford.edu/class/archive/cs/cs106l/cs106l.1192/lectures/lecture15/15_RAII.pdf

最新のC ++イディオム:

RAII: Resource Acquisition Is Initialization.

● When you initialize an object, it should already have 
  acquired any resources it needs (in the constructor).


● When an object goes out of scope, it should release every 
  resource it is using (using the destructor).

キーポイント:

● There should never be a half-ready or half-dead object.
● When an object is created, it should be in a ready state.
● When an object goes out of scope, it should release its resources. 
● The user shouldn’t have to do anything more. 

生のポインターはRAIIに違反します:ポインターがスコープ外になると、ユーザーが手動で削除する必要があります。

RAIIソリューションは次のとおりです。

Have a smart pointer class:
● Allocates the memory when initialized
● Frees the memory when destructor is called
● Allows access to underlying pointer

スマートポインタにコピーと共有が必要な場合は、shared_ptrを使用します。

● use another memory to store Reference counting and shared.
● increment when copy, decrement when destructor.
● delete memory when Reference counting is 0. 
  also delete memory that store Reference counting.

生のポインターを所有していないスマートポインターの場合は、weak_ptrを使用します。

● not change Reference counting.

shared_ptrの使用法:

correct way:
std::shared_ptr<T> t1 = std::make_shared<T>(TArgs);
std::shared_ptr<T> t2 = std::shared_ptr<T>(new T(Targs));

wrong way:
T* pt = new T(TArgs); // never exposure the raw pointer
shared_ptr<T> t1 = shared_ptr<T>(pt);
shared_ptr<T> t2 = shared_ptr<T>(pt);

生のポインタの使用は常に避けてください。

生のポインターを使用する必要があるシナリオの場合:

https://stackoverflow.com/a/19432062/2482283

nullptrではない生のポインタの場合は、代わりに参照を使用してください。

not use T*
use T&  

nullptrの可能性があるオプションの参照には、rawポインターを使用します。これは、次のことを意味します。

T* pt; is optional reference and maybe nullptr.
Not own the raw pointer, 
Raw pointer is managed by some one else.
I only know that the caller is sure it is not released now.

Related questions

MORE COOL STUFF

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは3日間一緒に夫と一緒に寝て、25年経ってもまだ夫と結婚しています

ケイト・ブランシェットは、夫に会ったとき、典型的な交際のアドバイスに逆らいました。

マイケルシーンが非営利の俳優である理由

マイケルシーンが非営利の俳優である理由

マイケルシーンは非営利の俳優ですが、それは正確にはどういう意味ですか?

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

ホールマークスターのコリンエッグレスフィールドがRomaDramaLiveでスリル満点のファンと出会う![エクスクルーシブ]

特徴的なスターのコリン・エッグレスフィールドは、RomaDrama Liveでのスリル満点のファンとの出会いについて料理しました!加えて、大会での彼のINSPIREプログラム。

「たどりつけば」をオンラインでストリーミングできない理由

「たどりつけば」をオンラインでストリーミングできない理由

ノーザンエクスポージャーが90年代の最も人気のある番組の1つになった理由を確認するには、Blu-rayまたはDVDプレーヤーをほこりで払う必要があります。

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖:アクセスは簡単ではありませんが、ハイキングする価値があります

ドミニカのボイリング湖は、世界で2番目に大きいボイリング湖です。そこにたどり着くまでのトレッキングは大変で長いですが、努力する価値は十分にあります。

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

私たちの水をきれいに保つのを助けるためにあなたの髪を寄付してください

サロンからのヘアトリミングや個人的な寄付は、油流出を吸収して環境を保護するのに役立つマットとして再利用できます。

ホワイトハウスの最も記憶に残る結婚式を見てください

ホワイトハウスの最も記憶に残る結婚式を見てください

過去200年以上の間にホワイトハウスで結婚したのはほんの数人です。彼らは誰でしたか、そしてそこで結婚式を獲得するために何が必要ですか?

驚くほど素晴らしいDropMixミュージックミキシングカードゲームは30ドルで驚くべき取引です

驚くほど素晴らしいDropMixミュージックミキシングカードゲームは30ドルで驚くべき取引です

DropMixはNFC対応のカードゲームで、基本的にはリミックスアーティストになります。現在、Amazonでは$ 30まで下がっており、これまでで最高の価格に匹敵します。ロックバンドで有名なHarmonixによって開発されたDropMixは、おそらく少し野心的すぎるように思われます。結局のところ、ほとんどの人は素晴らしいリズムを持っていませんが、ゲームは驚くほどうまく実行されます。

メアリーJ.ブライジがついにハリウッドウォークオブフェイムスターを獲得

メアリーJ.ブライジがついにハリウッドウォークオブフェイムスターを獲得

写真:APメアリーJ.ブライジは、間もなくハリウッドウォークオブフェイムのスターを獲得します。これは、メアリーJよりもハリウッドウォークオブフェイムのほうが正直なところ恩恵です。

MeltdownとSpectreの脆弱性についてこれまでに知っていることはすべて、簡単な方法で説明されています

MeltdownとSpectreの脆弱性についてこれまでに知っていることはすべて、簡単な方法で説明されています

画像:グラズ工科大学/ NataschaEiblがデザインしたロゴ。MeltdownとSpectreは、攻撃者がシステムメモリに保存されているあらゆる種類の情報にアクセスできるようにする2つの脆弱性に付けられた名前です。

彼のニューヨークの家から追い出されようとしている97歳の第二次世界大戦の獣医。メリーエフィングクリスマス

彼のニューヨークの家から追い出されようとしている97歳の第二次世界大戦の獣医。メリーエフィングクリスマス

日本人に襲われたときに真珠湾にいた97歳の第二次世界大戦のベテランが、ニューヨークのブルックリンから追い出されています。

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

小さな女性:脳卒中を患った後に病院から解放されたアトランタのジューシーな赤ちゃん:「まだ癒し」

シーレン「Ms.JuicyBaby」ピアソンは、先月脳卒中で入院した後、「もう一度たくさんのことをする方法を学ばなければならない」ため、言語療法を受けていることを明らかにしました。

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

エマストーンは彼女のクリフサイドマリブビーチハウスを420万ドルでリストアップしています—中を見てください!

オスカー受賞者の世紀半ばの家には、3つのベッドルーム、2つのバス、オーシャンフロントの景色があります。

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、母乳育児の経験の中で、彼女は「本当に、本当に落ち込んでいる」と言います

ジーニー・メイ・ジェンキンスは、生後4か月の娘、モナコに母乳育児をしていると語った。

投資ノート:Bioscout AU$300万シード

投資ノート:Bioscout AU$300万シード

Bioscoutは、農家を運転席に置くという使命を負っています。Artesian(GrainInnovate)やUniseedと並んで、最新のシードラウンドでチームを支援できることをうれしく思います。問題真菌症による重大な作物の損失は、農民にとって試練であることが証明されています。

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

リトルマーケットリサーチ1| 2022年のクイックグリンプス遠隔医療市場

遠隔医療は、パンデミック後の時代では新しいものではなく、時代遅れの分野でもありません。しかし、業界を詳しく見ると、需要と供給の強力な持続可能性と、米国で絶え間ない革命となる強力な潜在的成長曲線を示しています。

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

スタートアップ資金調達環境:タイのスタートアップエコシステムの次は何ですか?

2021年は、世界的なベンチャーキャピタル(VC)の資金調達にとって記録的な年でした。DealStreetAsiaによると、東南アジアも例外ではなく、この地域では年間で記録的な25の新しいユニコーンが採掘されました。

ムーアの法則を超えて

ムーアの法則を超えて

計算に対する私たちの欲求とムーアの法則が提供できるものとの間には、指数関数的に増大するギャップがあります。私たちの文明は計算に基づいています—建築と想像力の現在の限界を超える技術を見つけなければなりません。

Language