[LyX/master] Add move constructor and move assignment operator for FileName class
Stephan Witt
st.witt at gmx.net
Sun Jan 10 21:49:12 UTC 2021
Hi Yuriy,
I’m seeing a crash after this commit when using File->Open recent.
I’m having 5 files in list and the first entry has nullptr as private data.
@frame 4$ print lastfiles
(lyx::LastFilesSection::LastFiles) $0 = size=5 {
[0] = {
d = 0x0000000000000000
}
[1] = {
d = 0x000000012a896df0
}
[2] = {
d = 0x000000012a8921e0
}
[3] = {
d = 0x000000012a8923e0
}
[4] = {
d = 0x000000012a894ed0
}
}
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
frame #0: 0x00007fff6dfdc695 libc++.1.dylib`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::assign(char const*, unsigned long) + 19
frame #1: 0x00007fff6dfdc671 libc++.1.dylib`std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::operator=(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) + 47
* frame #2: 0x000000010102c984 LyX`lyx::support::FileName::operator=(this=0x000000012b8027d0, rhs=0x00007ffeefbfb030) at FileName.cpp:178:10
frame #3: 0x00000001004650a4 LyX`std::__1::vector<lyx::support::FileName, std::__1::allocator<lyx::support::FileName> >::insert(this=0x000000012b801770 size=5, __position=std::__1::vector<lyx::support::FileName, std::__1::allocator<lyx::support::FileName> >::const_iterator @ 0x00007ffeefbfab00, __x=0x00007ffeefbfb030) at vector:1792:18
frame #4: 0x0000000100464d0d LyX`lyx::LastFilesSection::add(this=0x000000012b801760, file=0x00007ffeefbfb030) at Session.cpp:89:12
frame #5: 0x0000000100edb89c LyX`lyx::frontend::GuiView::loadDocument(this=0x000000012b85ace0, filename=0x00007ffeefbfb030, tolastfiles=true) at GuiView.cpp:2445:28
frame #6: 0x0000000100edc47a LyX`lyx::frontend::GuiView::openDocument(this=0x000000012b85ace0, fname="/Users/stephan/Documents/lyxtest/tickets/7349/Dokument1.lyx") at GuiView.cpp:2517:17
frame #7: 0x0000000100bbfd60 LyX`lyx::frontend::GuiApplication::dispatch(this=0x0000000105fab890, cmd=0x000000012ba4f688, dr=0x00007ffeefbfcff0) at GuiApplication.cpp:1773:19
frame #8: 0x0000000100bbcebd LyX`lyx::frontend::GuiApplication::dispatch(this=0x0000000105fab890, cmd=0x000000012ba4f688) at GuiApplication.cpp:1484:3
frame #9: 0x000000010039c14a LyX`lyx::dispatch(action=0x000000012ba4f688) at LyX.cpp:1477:19
…
Stephan
> Am 09.01.2021 um 10:24 schrieb Yuriy Skalko <yuriy.skalko at gmail.com>:
>
> commit 854c9de8faf9eb357adc353fc9116996445d5e38
> Author: Yuriy Skalko <yuriy.skalko at gmail.com>
> Date: Thu Jan 7 02:27:31 2021 +0200
>
> Add move constructor and move assignment operator for FileName class
> ---
> src/support/FileName.cpp | 16 ++++++++++++++++
> src/support/FileName.h | 14 ++++++++++----
> 2 files changed, 26 insertions(+), 4 deletions(-)
>
> diff --git a/src/support/FileName.cpp b/src/support/FileName.cpp
> index 5295741..b9a1d43 100644
> --- a/src/support/FileName.cpp
> +++ b/src/support/FileName.cpp
> @@ -158,6 +158,13 @@ FileName::FileName(FileName const & rhs) : d(new Private)
> }
>
>
> +FileName::FileName(FileName && rhs) noexcept
> + : d(rhs.d)
> +{
> + rhs.d = nullptr;
> +}
> +
> +
> FileName::FileName(FileName const & rhs, string const & suffix) : d(new Private)
> {
> set(rhs, suffix);
> @@ -174,6 +181,15 @@ FileName & FileName::operator=(FileName const & rhs)
> }
>
>
> +FileName & FileName::operator=(FileName && rhs) noexcept
> +{
> + auto temp = rhs.d;
> + rhs.d = d;
> + d = temp;
> + return *this;
> +}
> +
> +
> bool FileName::empty() const
> {
> return d->name.empty();
> diff --git a/src/support/FileName.h b/src/support/FileName.h
> index 1cf1e73..2bc2e48 100644
> --- a/src/support/FileName.h
> +++ b/src/support/FileName.h
> @@ -42,15 +42,21 @@ public:
> */
> explicit FileName(std::string const & abs_filename);
>
> - /// copy constructor.
> + /// copy constructor
> FileName(FileName const &);
>
> - /// constructor with base name and suffix.
> + /// move constructor
> + FileName(FileName &&) noexcept;
> +
> + /// constructor with base name and suffix
> FileName(FileName const & fn, std::string const & suffix);
>
> - ///
> + /// copy assign
> FileName & operator=(FileName const &);
>
> + /// move assign
> + FileName & operator=(FileName &&) noexcept;
> +
> virtual ~FileName();
> /** Set a new filename.
> * \param filename the file in question. Must have an absolute path.
> @@ -219,7 +225,7 @@ private:
> bool copyTo(FileName const &, bool, FileNameSet &) const;
> ///
> struct Private;
> - Private * const d;
> + Private * d;
> };
>
>
> --
> lyx-cvs mailing list
> lyx-cvs at lists.lyx.org
> http://lists.lyx.org/mailman/listinfo/lyx-cvs
More information about the lyx-devel
mailing list