সি ++ 20 অবধি পূর্বনির্ধারিত আচরণের জন্য malloc ব্যবহার করছে


96

আমাকে জানানো হয়েছিল যে নীচের কোডটিতে সি ++ ২০ অবধি নির্ধারিত আচরণ রয়েছে:

int *p = (int*)malloc(sizeof(int));
*p = 10;

এটা কি সত্যি?

যুক্তিটি ছিল যে intবস্তুর আজীবন তার মান নির্ধারণের আগে শুরু করা হয়নি ( P0593R6 )। সমস্যা সমাধানের জন্য, অবস্থান newব্যবহার করা উচিত:

int *p = (int*)malloc(sizeof(int));
new (p) int;
*p = 10;

আমাদের কি সত্যই কোনও ডিফল্ট কনস্ট্রাক্টরকে কল করতে হবে যা অবজেক্টটির জীবনকাল শুরু করতে তুচ্ছ?

একই সময়ে, কোডটি খাঁটি সি তে অপরিজ্ঞাত আচরণ করে না তবে, আমি যদি intসি কোডে একটি বরাদ্দ করে সি ++ কোডে ব্যবহার করি তবে কী হবে?

// C source code:
int *alloc_int(void)
{
    int *p = (int*)malloc(sizeof(int));
    *p = 10;
    return p;
}

// C++ source code:
extern "C" int *alloc_int(void);

auto p = alloc_int();
*p = 20;

এটি কি এখনও অপরিবর্তিত আচরণ?


8
জন্য int? না std::string? হ্যাঁ.
এলজয়

8
@ এলজয়ের জন্য int, হ্যাঁ। এটি ঠিক যে এটি ব্যবহার না করলে বাস্তবে সমস্যা দেখা দেবে না। কারণ std::stringএটি স্পষ্টতই সমস্যার কারণ হবে।
ব্যারি

প্রাক সি ++ ২০ আপনি নতুন একটি প্লেসমেন্ট যুক্ত করতে পারেন। এটি তখন ভালভাবে গঠিত হবে এবং এটির জন্য সম্ভবত কোনও ব্যয় হবে না।
ফ্রান্সোইস অ্যান্ড্রিক্স

8
সি ++ ২০ এ নতুন নিয়মগুলি কী এটি পরিবর্তন করে?
কেভিন

4
এটা করা উচিত নয় int *p = (int*)malloc(sizeof(int)); p = new(p) int;? আমি একবার বুঝতে পেরেছিলাম যে নতুন নতুন প্লেসমেন্টের ফলাফল নির্ধারণ না করাও মারাত্মক প্রভাবের কারণ হতে পারে (যদিও এটি কিছুটা নির্বোধ দেখাচ্ছে)।
শেফ

উত্তর:


62

এটা সত্যি?

হ্যাঁ. প্রযুক্তিগতভাবে বলতে গেলে, এর কোনও অংশ নেই:

int *p = (int*)malloc(sizeof(int));

প্রকৃতপক্ষে কোনও ধরণের অবজেক্ট তৈরি করে int, সুতরাং pসেখানে কোনও প্রকৃত উপস্থিতি intনা থাকায় ডেরেফারেন্সিং ইউবি হয়।

আমাদের কি সত্যই ডিফল্ট কনস্ট্রাক্টরকে কল করতে হবে যা অবজেক্টের জীবন সময় শুরু করতে তুচ্ছ?

আপনি কি করতে হবে অনির্ধারিত আচরণ প্রাক সি ++ 20 এড়াতে সি ++ অবজেক্ট মডেল প্রতি? হ্যাঁ. কোনও সংকলক আসলে এটি না করে আপনি কি ক্ষতি করতে পারেন? আমার এরকম কিছু জানা নেই.

[...] এটি কি এখনও অপরিবর্তিত আচরণ?

হ্যাঁ. প্রাক-সি ++ ২০, আপনি এখনও বাস্তবে intকোথাও কোনও বস্তু তৈরি করেননি তাই এটি ইউবি।


মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
মাকেন

টিমসং-cpp.github.io/cppwp/n3337/basic . Life#1.1ভাষাটি ইউবি না হওয়ার পক্ষে কেন পর্যাপ্ত নয়? সর্বোপরি, intউদাহরণস্বরূপ যথাযথ আকার এবং প্রান্তিককরণের সঞ্চয়স্থান পাওয়া গেল - intবস্তুর জীবনকাল শুরু হয় সেখানে।
অবাকর

41

হ্যাঁ, এটি ইউবি ছিল। কোনও intঅস্তিত্বের উপায়গুলির তালিকা গণনা করা হয়েছিল এবং সেখানে কোনও প্রয়োগ হয় না, যদি না আপনি ম্যালোকটি অ্যাকিউসাল না করেন।

এটি স্ট্যান্ডার্ডের ক্ষেত্রে একটি ত্রুটি হিসাবে বিবেচিত হয়েছিল, তবে এটি একটি স্বল্প গুরুত্বের কারণ, বিশেষত ইউবির নির্দিষ্ট বিটের চারপাশে সি ++ সংকলক দ্বারা করা অপ্টিমাইজেশানগুলি ব্যবহারের ক্ষেত্রে সমস্যা তৈরি করে না।

দ্বিতীয় প্রশ্ন হিসাবে, সি ++ সি ++ এবং সি কীভাবে ইন্টারঅ্যাক্ট করে তা নির্দেশ দেয় না। সুতরাং সি এর সাথে সমস্ত মিথস্ক্রিয়া হ'ল ... ইউবি, ওরফে আচরণ সি ++ স্ট্যান্ডার্ড দ্বারা নির্ধারিত।


4
আপনি কি কোন ইন্টিরিউড থাকার উপায়ের তালিকাভুক্ত তালিকাতে প্রসারিত করতে পারেন? আমার মনে আছে আদিম ধরণের জীবনকাল সম্পর্কে একই ধরণের প্রশ্ন জিজ্ঞাসা করা, এবং বলা হয়েছিল যে কোনও আদিম উপস্থিত থাকার কথা বলতে পেরে "উপস্থিত" হতে পারে কারণ অনুমানটি অন্যথায় বলেনি। দেখে মনে হচ্ছে আমি অনুমানের একটি দরকারী অংশটি মিস করেছি! আমি কোন বিভাগটি অনুধাবন করা উচিত তা জানতে আগ্রহী!
আম্মন

7
@ কর্টআ্যামমন সি ++ তে কোন অবজেক্টের (যে কোনও ধরণের) উপস্থিত থাকার উপায়গুলির তালিকাভুক্ত তালিকা [অন্তর্ভুক্ত বিষয়বস্তু] এ রয়েছে : (1) সংজ্ঞা অনুসারে (2) নতুন-এক্সপ্রেশন দ্বারা (3) সুস্পষ্টভাবে নতুন নিয়ম অনুসারে P0593 (4) এ অস্থায়ী একটি ইউনিয়নের সক্রিয় সদস্য পরিবর্তন (5)। (3) সি ++ 20 এ নতুন, (4) সি ++ 17 এ নতুন ছিল।
ব্যারি

4
সি / সি ++ মিথস্ক্রিয়া কি সত্যিই ইউবি? অপরিবর্তিত না হয়ে বাস্তবায়ন-সংজ্ঞায়িত হওয়া আরও অর্থবোধ করবে, অন্যথায় extern "C"সিনট্যাক্সটি মোটেও আশ্চর্যজনক হবে না।
রুসলান

4
@ রুসলান: আইএসও সি ++ পাতা অপরিবর্তিত কোনও আচরণ সংজ্ঞায়িত করতে বাস্তবায়িত হয়। (উদাহরণস্বরূপ gcc -fno-strict-aliasing, বা ডিফল্টরূপে এমএসভিসি)। "বাস্তবায়ন সংজ্ঞায়িত" বলার জন্য সমস্ত সি ++ বাস্তবায়ন প্রয়োজন যে কোনও উপায়ে তারা কিছু সি বাস্তবায়নের সাথে হস্তক্ষেপ করে, তাই তারা এ জাতীয় কিছু করতে চায় কি না তা পুরোপুরি বাস্তবায়নের দিকে ছেড়ে দেওয়া বোধগম্য।
পিটার কর্ডেস

4
@ পিটারকর্ডস: আমি অবাক হই যে কেন এত লোক আইডিবি এবং ইউবির মধ্যে এই পার্থক্যকে স্বীকৃতি দিতে ব্যর্থ হয় এবং কিছু কল্পিত ধারণা গ্রহণ করে যে সমস্ত বাস্তবায়ন একটি নির্মাণের প্রক্রিয়াটি অর্থবহভাবে কার্যকর করার ক্ষেত্রে এই স্ট্যান্ডার্ডের ব্যর্থতা একটি রায়কে বোঝায় যে কোনও বাস্তবায়ন এমনটি করার আশা করা উচিত নয়, এবং বাস্তবায়নগুলি যা এটি করে না সেগুলি অবশ্যই পরিণতি হিসাবে নিকৃষ্ট হিসাবে দেখা উচিত নয়।
supercat
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.