मैं साझा पॉइंटर्स द्वारा इंगित ऑब्जेक्ट्स बनाने के लिए पहली बार boost :: make_shared का उपयोग कर रहा हूं। मुख्य रूप से क्योंकि हमारा कोड बहुत धीमा था और एकल आवंटन ने वास्तव में प्रदर्शन में सुधार करने में मदद की।बढ़ावा :: make_shared कॉलिंग (प्लेसमेंट) ऑपरेटर नया नहीं है?
कुछ मेमोरी लीक "हार्ड मैनुअल तरीके" को ठीक करने के बाद मैंने सभी प्रासंगिक कक्षाओं के लिए नए ऑपरेटरों को ओवरराइड करके एक साधारण मेमोरी लीक डिटेक्टर को लागू करने का निर्णय लिया, यह जानने के लिए कि कौन से ऑब्जेक्ट्स अभी भी हमारे आवेदन में विशिष्ट बिंदुओं पर जीवित हैं। मैंने इसे कई बार पहले लागू किया है और यह पता चला है कि मेरा कोड अब किसी ऑब्जेक्ट का पता लगाता है।
मैं लगा कि सभी मैं करना था ओवरराइड "प्लेसमेंट नया" है "सामान्य" ऑपरेटर के बजाय क्योंकि make_shared के लिए बढ़ावा वेबसाइट प्रलेखन से निम्न में से नया क्या है:
"प्रभाव: आवंटित स्मृति उपयुक्त प्रकार टी के ऑब्जेक्ट के लिए और नियुक्ति नई अभिव्यक्ति नई (PV) टी() या नए (PV) टी के माध्यम से इसे में एक वस्तु का निर्माण (std :: आगे (args) ...)। allocate_shared स्मृति आवंटित करने के लिए एक की प्रति का उपयोग करता है। यदि कोई अपवाद फेंक दिया गया है, तो प्रभाव नहीं है। "
हालांकि मेरा प्लेसमेंट नया भी नहीं कहा जा रहा है।
#include <iostream>
using namespace std;
#include "boost/shared_ptr.hpp"
#include "boost/make_shared.hpp"
class Test
{
public:
Test() { cout << "Test::Test()" << endl; }
void* operator new (std::size_t size) throw (std::bad_alloc) {
cout << "Test new" << endl;
return malloc(size);
}
void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw() {
cout << "Test non-throwing new" << endl;
return malloc(size);
}
void* operator new (std::size_t size, void* ptr) throw() {
cout << "Test non-throwing placement new" << endl;
return malloc(size);
}
};
void* operator new (std::size_t size) throw (std::bad_alloc) {
cout << "Global new" << endl;
return malloc(size);
}
int main() {
cout << "..." << endl;
boost::shared_ptr<Test> t1(boost::make_shared<Test>());
cout << "..." << endl;
boost::shared_ptr<Test> t2(new Test());
cout << "..." << endl;
return 0;
}
निम्नलिखित में से कौन उत्पादन प्रस्तुत करता है:: मैं एक छोटे से परीक्षण कार्यक्रम व्यवहार को पुनः के लिए लिखा है
...
Global new
Test::Test()
...
Test new
Test::Test()
Global new
...
मैं "परीक्षण गैर फेंकने नियुक्ति नए" उत्पादन के 3 लाइन पर उम्मीद कर रहा था। आपको क्या लगता है कि व्यवहार होना चाहिए? क्या आप सहमत हैं कि make_shared के दस्तावेज़ीकरण के अनुसार इसे मेरे टेस्ट क्लास के प्लेसमेंट के नए ऑपरेटर को कॉल करना चाहिए? या मैंने इसे गलत समझा?
मैं स्थानीय रूप से बूस्ट कार्यान्वयन की प्रतिलिपि बना सकता हूं और पाठ्यक्रम के नए ऑपरेटर को कॉल जोड़ सकता हूं। लेकिन, क्या यह उचित होगा, या यह प्लेसमेंट के इच्छित अर्थशास्त्र का उल्लंघन करेगा?
आपके समय और आपकी सहायता के लिए अग्रिम धन्यवाद।
बूस्ट के को देखकर, यह वैश्विक प्लेसमेंट नया ऑपरेटर :: नया (पीवी) टी() का उपयोग कर रहा है। यही कारण है कि आपकी कक्षा स्तर की नियुक्ति नहीं कहा जा रहा है ... नए क्वालीफायर '::' को नए से पहले हटाकर, make_shared वास्तव में आपके क्लास लेवल प्लेसमेंट नए ऑपरेटर को कॉल करता है। –
Gob00st