Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.c++ > #70247
| From | Volker Wippel <Volker.Wippel@v2c2RemoveNoSpam.at> |
|---|---|
| Newsgroups | comp.lang.c++ |
| Subject | Re: I'm not able to find the error |
| Date | 2019-12-04 18:40 +0100 |
| Message-ID | <h4q9d8Fo31tU1@mid.individual.net> (permalink) |
| References | <qs8ock$839$1@gioia.aioe.org> |
On 2019-12-04 17:54, alexo wrote:
> Hello guys,
> I've written this code to get acquainted to assignment operators,
> move constructors and move assignment operators, but I got a
> strange behavior in my code:
> I report it in its fullness because it's 123 lines:
>
> // code starts here
> #include <iostream>
>
> using std::cout;
> using std::ostream;
>
> class Vector
> {
> friend ostream& operator<<(ostream& os, Vector& v)
> {
> for(size_t i=0; i<v.size(); i++)
> os << v[i] << ' ';
>
> return os << '\n';
> }
>
> public:
> Vector(int n=5) : sz(n), data( new int[n])
> {
> for(size_t i=0; i < sz; i++)
> data[i] = 0;
> }
>
> Vector(const Vector& r) : // the copy constructor
> sz(r.size()),
> data( new int[sz] )
> {
> for(size_t i=0; i < sz; i++)
> data[i] = r.data[i];
> }
>
>
> Vector(const Vector&& r) // the move constructor
> sz{r.size()},
> data{r.data}
> { }
>
> Vector& operator= (const Vector& r) // the copy assignment
> {
> delete [] data;
>
> sz = r.size();
> data = new int[sz];
>
> for(size_t i=0; i < sz; i++)
> data[i] = r.data[i];
>
> return *this;
> }
>
> Vector& operator= (const Vector&& r) // the move assignment
> {
> delete [] data;
>
> data = new int[r.size()];
> data = r.data;
>
> return *this;
> }
>
> ~Vector() // the destructor
> {
> cout << "deleting memory of array ";
> cout << *this;
>
> delete [] data;
> data = nullptr;
> }
>
> unsigned int size() const { return sz; }
>
> int& operator[] (int i) { return data[i]; }
>
> Vector operator+(Vector& rhs)
> {
> size_t maxdim = sz, mindim = sz;
>
> if(sz < rhs.size())
> {
> maxdim = rhs.size();
> }
> else
> {
> mindim = rhs.size();
> }
>
> Vector temp (maxdim);
>
> for(size_t i=0; i < mindim; i++)
> temp[i] = data[i] + rhs[i];
>
> return temp;
> }
>
> private:
> size_t sz;
> int *data;
> };
>
> int main()
> {
> Vector v1(3), v2;
>
> cout << "v1.size() = " << v1.size() << '\n'
> << "v2.size() = " << v2.size() << "\n\n";
>
> v1[1] = 1; v2[2] = 3; // using the index of '[]' operator
>
> cout << "v1 = " << v1;
> cout << "v2 = " << v2;
>
>
> Vector s;
> s = v1 + v2; // these two lines give runtime error
>
> // Vector s = v1 + v2; // this line is ok instead
>
> cout << "v1 + v2 = " << s << '\n';
>
> cout << "destroying objects..." << '\n';
>
> return 0;
> }
> // code ends here
>
>
> Now I give a description of the error.
> g++ executing this code on my gives:
>
> v1.size() = 3
> v2.size() = 5
>
> v1 = 0 1 0
> v2 = 0 0 3 0 0
> deleting memory of array 0 1 3 0 0
> v1 + v2 = 0 0 -1704935408 22058 0
>
> destroying objects...
> deleting memory of array 0 0 -1704935408 22058 0
> free(): double free detected in tcache 2
> aborted
>
> As the title of the message says, I'm stuck.
> I did my best to write it, but evidently some subtle error lays
> between those lines.
>
> If you comment the following:
>
> Vector s;
> s = v1 + v2;
>
> and uncomment
>
> // Vector s = v1 + v2;
>
> the program behaves correctly.
> What could it be the problem?
>
> Thank you.
Hi
Vector(Vector&& r) // no const
sz{r.size()},
data{r.data}
{
r.data = nullptr; // you move from it, so r is empty
r.sz = 0;
}
Same in operator=(Vector&& r)
data{std::move(r.data)} would not help because it is a simple pointer.
Back to comp.lang.c++ | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
I'm not able to find the error alexo <alelvb@inwind.it> - 2019-12-04 17:54 +0100
Re: I'm not able to find the error Volker Wippel <Volker.Wippel@v2c2RemoveNoSpam.at> - 2019-12-04 18:40 +0100
Re: I'm not able to find the error Daniel <danielaparker@gmail.com> - 2019-12-04 10:01 -0800
Re: I'm not able to find the error Daniel <danielaparker@gmail.com> - 2019-12-04 10:06 -0800
Re: I'm not able to find the error Manfred <noname@add.invalid> - 2019-12-04 20:16 +0100
Re: I'm not able to find the error Manfred <invalid@add.invalid> - 2019-12-05 01:42 +0100
Re: I'm not able to find the error alexo <alelvb@inwind.it> - 2019-12-05 03:45 +0100
Re: I'm not able to find the error alexo <alelvb@inwind.it> - 2019-12-05 03:58 +0100
Re: I'm not able to find the error Mike Terry <news.dead.person.stones@darjeeling.plus.com> - 2019-12-05 04:10 +0000
Re: I'm not able to find the error alexo <alelvb@inwind.it> - 2019-12-05 05:45 +0100
Re: I'm not able to find the error Manfred <noname@add.invalid> - 2019-12-05 17:29 +0100
Re: I'm not able to find the error alexo <alelvb@inwind.it> - 2019-12-04 22:52 +0100
Re: I'm not able to find the error Daniel <danielaparker@gmail.com> - 2019-12-04 16:47 -0800
Re: I'm not able to find the error alexo <alelvb@inwind.it> - 2019-12-05 03:37 +0100
csiph-web