C++,为什么我没有得到值"123456"
C++ , how come I do not get the value "123456"
我正在尝试打印出值123456,但它给了我垃圾值。我该如何解决它?你能解释一下为什么它给出了错误的值吗?
#include <stdio.h>
#include <stdlib.h>
struct MyInfo
{
private:
int private_key = 123456;
public:
int setkey(int value)
{
private_key = value;
}
int GetScore()
{
return private_key;
}
};
void main()
{
MyInfo* pMyInfo;
pMyInfo = (MyInfo*)malloc(sizeof(MyInfo));
printf("%dn", pMyInfo->GetScore());
free(pMyInfo);
}
不要使用malloc
/free
,而是使用pMyInfo = new MyInfo()
和delete pMyInfo
。只有new
会调用初始化值的构造函数;只有delete
会调用析构函数。
关于注释,意思是,您也可以将其放在堆栈上,即MyInfo pMyInfo;
,即不是指针。这将自动调用构造函数,当它超出范围时,将自动调用析构函数。
int private_key = 123456;
这实际上只是一个伪装的构造函数初始化,这意味着它与:
MyInfo() : private_key(123456) {}
由于malloc
和友元是从 C 继承而来的,而 C 没有类(因此没有特殊的成员函数(,因此malloc
和朋友不会调用这些必要的特殊成员函数来设置你的对象。但是,C++等效的new
这样做,这就是为什么您应该始终使用new
而不是malloc
,delete
而不是free
。
但是等等,还有更多...
实际上,您也不应该使用new
,总有比使用原始动态分配更好的选择。如果您确实需要动态内存分配,请使用std::unique_ptr
或多个对象std::vector
但大多数时候您甚至不需要这些(这里有大量的帖子解释了何时必须进行动态分配,对于所有其他情况,只需使用具有自动生命周期的存储(在这种情况下,您只需要一个本地对象:
MyInfo myInfo;
printf("%dn", myInfo.GetScore());
看看您的代码如何变得更短、更易于维护和更简洁,以实现相同的目标?
当你声明一个 MyInfo 类型的指针时,这并不意味着它指向的对象实际上是你的结构,它只是假设它会是。
当你做malloc(sizeof(MyInfo))
时,你只是分配你的结构可能占用的大小的内存,它不会创建一个对象。因此,当你尝试做GetScore()
时,它会访问内存位置,它假设包含你的private_key
,但它只是包含垃圾。
不要C
和C++
混为一谈
您应该避免C++
malloc/alloc
等,如果要使用动态分配的对象new
请选择运算符。
添加构造函数以初始化值
private;
int private_key;
public:
MyInfo () {
private_key = 123456;
}
并实现主要喜欢
// without pointer
void main () {
MyInfo myinfo;
printf("%dn", myinfo.GetScore());
}
// with pointer
void main () {
MyInfo *myinfo = new MyInfo();
printf("%dn", myinfo->GetScore());
}
仅供参考,可以在原始存储中初始化对象,但对于此用例而言,这将是矫枉过正且相当愚蠢的。由于 malloc 只分配原始内存而不构造对象,因此您可以使用 new 放置来第二次构建对象:
int main() // I can't stand void main
{
MyInfo* pMyInfo;
pMyInfo = (MyInfo*)malloc(sizeof(MyInfo)); // only allocate raw memory
new((void *) pMyInfo) MyInfo; // construct the object
std::cout << pMyInfo->GetScore() << std::endl; // no reason for C printf here
pMyInfo->~MyInfo(); // placement new requires explicit destructor call if not trivial
free(pMyInfo);
return 0;
}
对于如此简单的情况,不要这样做。放置新应仅在分配不平凡的非常特殊的情况下使用,例如,当您使用共享内存时。但这里正确的方法是简单地使用自动对象:
int main() // I can't stand void main
{
MyInfo pMyInfo;
std::cout << pMyInfo.GetScore() << std::endl;
return 0;
}
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 为什么会发生堆损坏
- 为什么使用 "this" 指针调用派生成员函数?
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么比较运算符如此快速
- 为什么 Serial.println(<char[]>);返回随机字符?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 为什么不;名字在地图上是按顺序排列的吗
- 我的字符计数代码计算错误.为什么
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 为什么 std::unique 不调用 std::sort?
- 既然存在危险,为什么项目要使用-I include开关
- C++,为什么我没有得到值"123456"