指向向量的指针:出现分割错误

| 我在以下代码中遇到了细分错误。您能帮我弄清楚吗?在下面的代码中,它将打印“ ok here \”。一旦重新分配内存,就会显示分段错误。但为什么 ?有什么办法吗? 任何帮助,将不胜感激。
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;

class Cube
{
public:
    char *str;

    Cube(int len)
    {
        str = new char[len+1];
    }
    Cube(const Cube &c)
    {
        str = new char[strlen(c.str) + 1];
        strcpy(str, c.str);
    }   
    ~Cube()
    {
        delete [] str;
    }
};

void foo(vector <Cube> *vec)
{
    for (int i = 0; i < 10; i++)
    {
        char in [] = \"hello !!\";
        Cube *c = new Cube(strlen(in)+1);
        strcpy(c->str, in);
        vec->push_back(*c);
        cout << \"ok here\" << endl;
        delete [] c;
    }
}

int main()
{
    vector <Cube> vec;

    foo(&vec);  
    return 0;    
}
    
已邀请:
        您没有遵循以下三个规则:
Cube
未实现正确的副本分配运算符。正如其他人提到的那样,您也使
new[]
delete
不匹配,后者只能流下眼泪。 也就是说,您无需为此使用任何指针或显式动态分配。您应将
new char[]
的用法替换为
std::string
,并且不要在堆上分配任何
Cube
对象。在编写良好的C ++程序中,很少使用
new
,而几乎不需要使用
delete
。 该程序不进行显式动态分配,其结果与您对程序的期望相同,但是是正确的。请注意,当您不用担心自己动态分配或显式破坏事物时,代码会干净得多!
#include <string>
#include <vector>

struct Cube {
    std::string str;
    explicit Cube(std::string const& s) : str(s) { }
};

void foo(std::vector<Cube>& vec) {
    for (int i = 0; i < 10; ++i) {
        vec.push_back(Cube(\"hello !!\"));
    }
}

int main() {
    std::vector<Cube> vec;
    foo(vec);
}
确保您有一本不错的C ++入门书。     
        您正在此处3个数组中包含1个数组:
delete [] c;
但是您没有在此处分配数组:
Cube *c = new Cube(strlen(in)+1);
应该只是:
delete c;
    
        
delete [] c;
应该
delete c;
除此之外,“ 1”类本身是可疑的。最好使用ѭ5而不是C样式的字符串。     
        你用过
delete [] c;
如果c是这样分配的:
Cube * c = new Cube[3]; //3 for example
然后,delete [] c是合适的。在这种情况下,您应该省略[]。     

要回复问题请先登录注册