Опитвайки се да разберем как да управляваме паметта в C++, използвайки C стил:
struct aaa{
public:
int a ;
int b ;
std::string c ;
};
int asize =5;
int main()
{
aaa * a;
a = static_cast<aaa *>(malloc(sizeof(aaa) * asize));
for (int i;i<asize;i++)
{
a[i] = aaa(); //crash
}
a[0].c = "ddd";
a[1].c = "ccc";
a[2].c = "eee";
}
Срив на програмата при създаване на структурен обект в първия сегмент на паметта. Какво правя грешно (освен че правя C в C++)?
malloc
. Не използвайтеmalloc
, използвайтеnew
. - person molbdnilo   schedule 23.01.2018std::malloc
не извиква конструктора на тип. Законно е, ако конструкторът от типа, който искате да конструирате, е тривиален, но вашият не е, порадиc
. - person Rakete1111   schedule 23.01.2018for(...)
- person vico   schedule 23.01.2018aaa()
, след което го премествате-присвоявате наa[i]
. Правилният начин за извикване на конструктора в паметта заa[i]
би бил да се използваnew (&a[i]) aaa()
илиnew (a + i) aaa()
. - person jotik   schedule 23.01.2018new[]
за разпределяне на масив - person pm100   schedule 23.01.2018But a[i] = new (a + i) aaa()
дава грешкаerror: no match for ‘operator=’ (operand types are ‘aaa’ and ‘aaa*’)
- person vico   schedule 24.01.2018new (a + i) aaa();
. Не е необходимо задание. Той просто конструираaaa
обект на адресa + i
. - person jotik   schedule 24.01.2018