nBlockUse)"崩溃。 C++-6ren"> nBlockUse)"崩溃。 C++-我有一段简单的代码: struct A { char* str; A() : str(NULL) {} ~A() { delete[] str;-6ren">
gpt4 book ai didi

c++ - 解决 "_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)"崩溃。 C++

转载 作者:行者123 更新时间:2023-11-30 00:48:52 25 4
gpt4 key购买 nike

我有一段简单的代码:

    struct A {
char* str;
A() : str(NULL) {}
~A() { delete[] str; }
};

void bar(A a) {
printf("%s", a.str);
}

int main() {
A b;
b.str = _strdup("string");
bar(b);
return 0;
}

导致断言失败。据我所知,问题的根源是 c'tor\d'tor。请帮忙!

最佳答案

你需要一个复制构造函数,否则你的 str调用 bar 时字段将被浅层复制,以及 A 两个实例的析构函数将尝试两次释放相同的内存。还有 _strdup使用 malloc ,因此您应该将其与对 free 的调用相匹配而不是 operator delete[] .

对于 C++,您只需使用 std::string 就可以避免所有这些内存管理问题。甚至 std::vector<char>

例子:

struct A 
{
char* str;
A(): str(NULL) {}

// Copy Ctor
A(const A& other): str(strdup(other.str)) {}

// Copy Assignment
A& operator=(const A& other)
{
if (this != &other)
{
free(str);
str = strdup(other.str);
}
return *this;
}

// Dtor
~A()
{
free(str);
}
};

或者,更简单:

#include <iostream>
#include <string>

using namespace std;

struct A
{
string str;
};

void bar(const A& a) {
cout << a.str << endl;
}

int main() {
A b;
b.str = "string";
bar(b);
}

关于c++ - 解决 "_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)"崩溃。 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30423353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com