C++ C++;在Linux中重新解释\u cast内核,但在MAC中运行succee

C++ C++;在Linux中重新解释\u cast内核,但在MAC中运行succee,c++,reinterpret-cast,C++,Reinterpret Cast,在某些情况下,我希望malloc是一个块内存,例如:内存的第一部分将包含字符串,第二部分将包含长类型数据。因此,我尝试下面的演示代码 下面的代码可以在MAC中成功运行,但在Linux中内核转储 valgrind res: 其中: 第7行是:str[0]=key.data() 第13行是test_缓存(缓存,“test”) #包括 #包括 #包括 #包括 无效测试_缓存(字符*缓存,标准::字符串键){ std::string*str=reinterpret_cast(缓存); str[0]=k

在某些情况下,我希望malloc是一个块内存,例如:内存的第一部分将包含字符串,第二部分将包含长类型数据。因此,我尝试下面的演示代码

下面的代码可以在MAC中成功运行,但在Linux中内核转储

valgrind res:

其中:

  • 第7行是:
    str[0]=key.data()
  • 第13行是
    test_缓存(缓存,“test”)
  • #包括
    #包括
    #包括
    #包括
    无效测试_缓存(字符*缓存,标准::字符串键){
    std::string*str=reinterpret_cast(缓存);
    str[0]=key.data();
    }
    int main()
    {
    char*cache=reinterpret_cast(calloc(1000,1));
    测试缓存(缓存,“测试”);
    std::string*str=reinterpret_cast(缓存);
    printf(“%s\n”,str[0].c_str());
    免费(缓存);
    }
    <> >请阅读一个好的,然后看到和你的C++编译器(也许)和调试器(例如)的文档。你在使用中是正确的,但是当然你应该阅读它的文档(也考虑使用,并且注意)。
    我的建议是在编译C++代码时启用所有警告和调试信息。
    <> P>使用GC>G++WALL-WOTH-G/<代码>编译C++代码。
    在C++中,使用动态内存分配的最常用方式是不使用“代码> > Malc C/代码>和<代码>免费< /代码>函数,但要使用。在某些情况下,您可以重新定义新的
    。但是,请注意,这是一个优秀的编码规则

    实践中,在几个C++实现中,<代码>新< /COD>在调用构造函数之前可能调用<代码> MalOC >调用Debug > >代码>调用析构函数后,可以调用<代码>自由<代码>。当

    malloc
    失败时,
    new
    应引发异常

    有关更多详细解释,请参见报告,重点介绍最近的GCC(如2020年夏季)

    <>在C++中,你想利用强大的标准C++库,所以使用字符串,学习使用和./P> 或

    害怕C++11标准(或更高版本的标准),以后再阅读

    考虑在整个C++程序中使用静态源代码分析器,如++或。如果允许使用,考虑使用,或编写自己的静态分析的目的。如果在2020年夏季,您的GCC大于GCC 10,请执行(在获得经理或客户的许可后)。当然,编写GCC插件可能需要几个月的工作,所以对于大型C++程序来说是值得的。


    std::string

    的实现详细信息。如果使用字符串指针而不构建字符串对象,则会出现未定义的行为。未定义意味着任何事情都可能发生,包括看起来正常工作。但是你永远也不能指望它。你的程序表现出未定义的行为,在对象的生命周期开始之前访问对象。“似乎有效”是未定义行为的一种可能表现形式;崩溃是另一个原因<代码>缓存
    不包含
    std::string
    的实例。我明白了,非常感谢你的专业回答和建议,我会继续学习,非常感谢
    #include <iostream>
    #include <stdlib.h>  
    #include <stdio.h>
    #include <string>
    
    void test_cache(char *cache, std::string key) {
      std::string* str = reinterpret_cast<std::string*> (cache);
      str[0] = key.data();
    }
    
    int main()
    {
      char *cache = reinterpret_cast<char *> (calloc(1000, 1));
      test_cache(cache, "test");
      std::string* str = reinterpret_cast<std::string*> (cache);
      printf("%s\n",str[0].c_str());
      free(cache);
    }
    
    std::string* str = reinterpret_cast<std::string*> (cache);
    
     auto str = new std::string(cache);
    
     std::string str(cache);