【发布时间】:2011-08-16 22:17:20
【问题描述】:
情况如下:
我使用 malloc 为结构分配内存。 该结构包含各种项目,例如指针、字符串变量和向量。
事实上,当我们使用 malloc 时,不会调用任何构造函数。使用类似于以下代码的代码,我遇到了一些变量有效而其他变量无效的情况。
注意:以下代码无法编译。其目的只是为了说明情况。
struct MyStruct
{
MyClass* mFirstClass;
bool mBool;
std::string mString;
std::vector<MyClass> mVector;
};
int main()
{
MyStruct* wMyStructure;
wMyStructure = (MyStruct*) malloc (sizeof(MyStruct));
MyClass wMyClassObject;
wMyStructure->mFirstClass = new MyClass();
wMyStructure->mFirstClass->func();
wMyStructure->mBool = false;
wMyStructure->mString = "aString";
wMyStructure->mVector.push_back(wMyClassObject);
return 0;
}
通过使用指针而不是那些变量 (std::string* mString),然后调用对象构造函数 (mString = new std::string;) 不会引发异常。
但是,我遇到过这样一种情况,即使用 mString 没有问题而没有调用构造函数,但是当涉及到向量时,应用程序会自动退出。
这给我留下了很多问题:
如果不使用构造函数,对象何时会抛出异常?
在我遇到的情况下,只有矢量引起了问题。 mString 可以保持原样还是我应该称它为构造函数?
什么是最安全的方式,使用 malloc 来完成整个事情?
【问题讨论】:
-
您可能有一个有趣的问题,但请从头开始重写这个问题,并着手进行演示。问题中没有任何意义或者是 C++(没有
void main()开头)。为了您尊敬的读者,请不要将您的班级称为“班级”。 -
我在您的代码中没有看到对 malloc 的调用。查找'placement new operator'。
-
@bmargulies:更贴切的可能是“placement-new 表达式”。接线员很无聊,反正你一般不会直接打电话给接线员的。
-
对不起,我写这个问题的时候分心了。我希望这一次更有意义。
-
好吧,我不能真正发布我正在处理的代码,因为它不是我的。至于选型,我弄错了,应该是 MyStruct*。我的主要目标并不是真正找到问题的解决方案,而是了解问题的原因。
标签: c++ vector constructor memory-management malloc