Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
malloc和calloc与std::string之间的差异 我最近进入C++,遇到了Maloc的问题。 下面的代码不会输出“Success”(程序崩溃,退出代码为0xC0000005),而如果我使用calloc,则一切正常 int main(){ std::string* pointer = (std::string*) malloc(4 * sizeof(std::string)); for(int i = 0; i < 4; i++){ pointer[i] = "test"; } std::cout << "Success" << std::endl; return 0; }_C++_Malloc_Stdstring_Calloc - Fatal编程技术网

malloc和calloc与std::string之间的差异 我最近进入C++,遇到了Maloc的问题。 下面的代码不会输出“Success”(程序崩溃,退出代码为0xC0000005),而如果我使用calloc,则一切正常 int main(){ std::string* pointer = (std::string*) malloc(4 * sizeof(std::string)); for(int i = 0; i < 4; i++){ pointer[i] = "test"; } std::cout << "Success" << std::endl; return 0; }

malloc和calloc与std::string之间的差异 我最近进入C++,遇到了Maloc的问题。 下面的代码不会输出“Success”(程序崩溃,退出代码为0xC0000005),而如果我使用calloc,则一切正常 int main(){ std::string* pointer = (std::string*) malloc(4 * sizeof(std::string)); for(int i = 0; i < 4; i++){ pointer[i] = "test"; } std::cout << "Success" << std::endl; return 0; },c++,malloc,stdstring,calloc,C++,Malloc,Stdstring,Calloc,如果我分配的金额是正常金额的12倍,Malloc也可以工作 有人能解释一下这种行为吗?这与std::string有关吗 有人能解释一下这种行为吗 在这两种情况下,行为都没有定义。calloc案例似乎有效,只是因为运气不好 为了在分配的内存空间中使用对象,必须首先构造该对象。您从未构造过任何字符串对象 构造动态分配的对象数组的最简单方法是使用向量: std::vector<std::string> vec(4); std::vec(4); 有人能解释一下这种行为吗 在这两种情况下,

如果我分配的金额是正常金额的12倍,Malloc也可以工作

有人能解释一下这种行为吗?这与std::string有关吗

有人能解释一下这种行为吗

在这两种情况下,行为都没有定义。
calloc
案例似乎有效,只是因为运气不好

为了在分配的内存空间中使用对象,必须首先构造该对象。您从未构造过任何字符串对象

构造动态分配的对象数组的最简单方法是使用向量:

std::vector<std::string> vec(4);
std::vec(4);
有人能解释一下这种行为吗

在这两种情况下,行为都没有定义。
calloc
案例似乎有效,只是因为运气不好

为了在分配的内存空间中使用对象,必须首先构造该对象。您从未构造过任何字符串对象

构造动态分配的对象数组的最简单方法是使用向量:

std::vector<std::string> vec(4);
std::vec(4);
这只分配足够容纳4个字符串对象的内存。它不构造它们,构造之前的任何用途都是未定义的

编辑:至于它为什么与calloc一起工作:最有可能的是,
std::string
的默认构造函数将所有字段设置为零。在您的系统上,calloc可能只是碰巧与std::string默认构造做了相同的事情。相反,小型malloc()对象可能分配有初始垃圾,因此这些对象不处于有效状态

使用足够大的
malloc()
时,效果类似于
calloc()
。当
malloc()
无法重用以前分配的块(带有潜在的垃圾)时,它会从操作系统请求新块。通常,操作系统会清除它交给应用程序的任何块(以避免信息泄漏),使大malloc()的行为类似于calloc()

这不适用于所有系统和编译器。这取决于编译器如何实现
std::string
,也取决于未定义的行为可能会如何混淆编译器。这意味着,如果它现在可以在您的编译器上工作,那么它可能无法在其他系统上工作,或者无法在较新的编译器上工作。更糟糕的是,在您编辑程序中看似无关的代码后,它可能会停止使用编译器在您的系统上工作永远不要依赖未定义的行为

最简单的解决方案是让C++处理分配和构造,然后用销毁和解除分配。这是自动完成的

std::vector<std::string> str_vec(4);
如果出于某种奇怪的原因,您仍然希望使用malloc(这在99.99%的情况下是个坏主意),那么您必须自己构造和销毁对象:

constexpr int size = 4;
std::string* pointer = (std::string*) malloc(size * sizeof(std::string)); 
for (int i=0; i != size ;++i)
    // placement new constructs the strings
    new (pointer+i) std::string;

... use the pointer ....

for (int i=0; i != size ;++i)
    // destruct the strings
    pointer[i].~string();
free(pointer);
这只分配足够容纳4个字符串对象的内存。它不构造它们,构造之前的任何用途都是未定义的

编辑:至于它为什么与calloc一起工作:最有可能的是,
std::string
的默认构造函数将所有字段设置为零。在您的系统上,calloc可能只是碰巧与std::string默认构造做了相同的事情。相反,小型malloc()对象可能分配有初始垃圾,因此这些对象不处于有效状态

使用足够大的
malloc()
时,效果类似于
calloc()
。当
malloc()
无法重用以前分配的块(带有潜在的垃圾)时,它会从操作系统请求新块。通常,操作系统会清除它交给应用程序的任何块(以避免信息泄漏),使大malloc()的行为类似于calloc()

这不适用于所有系统和编译器。这取决于编译器如何实现
std::string
,也取决于未定义的行为可能会如何混淆编译器。这意味着,如果它现在可以在您的编译器上工作,那么它可能无法在其他系统上工作,或者无法在较新的编译器上工作。更糟糕的是,在您编辑程序中看似无关的代码后,它可能会停止使用编译器在您的系统上工作永远不要依赖未定义的行为

最简单的解决方案是让C++处理分配和构造,然后用销毁和解除分配。这是自动完成的

std::vector<std::string> str_vec(4);
如果出于某种奇怪的原因,您仍然希望使用malloc(这在99.99%的情况下是个坏主意),那么您必须自己构造和销毁对象:

constexpr int size = 4;
std::string* pointer = (std::string*) malloc(size * sizeof(std::string)); 
for (int i=0; i != size ;++i)
    // placement new constructs the strings
    new (pointer+i) std::string;

... use the pointer ....

for (int i=0; i != size ;++i)
    // destruct the strings
    pointer[i].~string();
free(pointer);

考虑阅读A。不要在C++中使用<代码> Malc < /Calp> <代码> CaloC< /Calp> <代码> ReLoC/<代码> >代码> Fabue/Cuff>。使用正确调用构造函数/析构函数的
new
/
new[]
/
delete
。或者更好地使用容器和/或智能指针。避免手动内存管理。问题是您没有构造所需的字符串……如果您一心想使用
malloc
,则需要放置
new
在将其用作字符串之前返回的内存……我认为它会初始化字符串本身,而不会构造字符串。你使用它的方式是UB。@ TinSlam,我最近进入了C++——你从C++开始以来一直在读什么书?我知道的任何一本书都没有介绍一个C++程序员在创建对象时使用<代码> Malc C >代码>或<代码> CaloC。或者你正在阅读<代码> C <代码>书籍并将其应用到C++?如果是这样,你会犯更多的错误,与你现在所做的类似。考虑阅读A。不要在C++中使用<代码> Malc <代码> CaloC< /Calp> <代码> RealCalb/Cux> <代码> Fabue/Cuff>。使用正确调用构造函数/析构函数的
new
/
new[]
/
delete
。或者更好,使用容器和/或容器